{"openapi":"3.0.0","paths":{"/v0/blocks/{block-selector}/timestamp":{"get":{"description":"The hash and unix timestamp of a block, identified by its number on a given chain.","operationId":"BlockTimestampController_getTimestamp","parameters":[{"name":"block-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<block_number>. Example: 1:19700000.","schema":{"format":"<chain_id>:<block_number>","example":"1:19700000","type":"string"},"example":"1:19700000"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlockTimestampResponse"}}}}},"summary":"Get block timestamp","tags":["Blocks"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nBLOCK_SELECTOR=\"<chain_id>:<block_number>\"\n\ncurl -sS \"${BASE_URL}/v0/blocks/${BLOCK_SELECTOR}/timestamp\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst blockSelector = \"<chain_id>:<block_number>\";\n\nconst url = new URL(`${baseUrl}/v0/blocks/${blockSelector}/timestamp`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nblock_selector = \"<chain_id>:<block_number>\"\nurl = f\"{base_url}/v0/blocks/{block_selector}/timestamp\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/chains":{"get":{"description":"Fully supported EVM chains exposed by the Core REST API, with the chain id, network name, the protocols deployed on the chain, and the last block fully processed by all realtime service jobs for the chain.","operationId":"ChainsController_getChains","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChainsResponse"}}}}},"summary":"Get chains","tags":["Chains"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\n\ncurl -sS \"${BASE_URL}/v0/chains\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\n\nconst url = new URL(`${baseUrl}/v0/chains`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nurl = f\"{base_url}/v0/chains\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/curators":{"get":{"description":"Cursor-paginated list of curator identities from Morpho's curator registry, `morpho-org/morpho-blue-api-metadata/data/curators-listing.json`, the same source as `GET /v0/curators/{curator-selector}/details`. Use it to discover curators before you know a curator address; each item groups the curator's registered addresses across chains.\n\n**Global registry metadata, not on-chain facts.** `curator_id`, `name`, `image_url` and `verified` are editorial values Morpho maintains in the registry. They are an explicit exception to Core's facts-only rule, like the details route. `verified` is Morpho's registry flag, not an on-chain property, and a registry address is not proof that it holds a curator role on any vault.\n\n**Membership.** A curator is listed when it has at least one registered address on a chain in `chain_ids` (default: every chain Core exposes). Unverified curators are included unless `verified=true`. `addresses` always lists the curator's addresses on every exposed chain, so filtering by chain does not split an identity.\n\n**Not here.** Socials are on the details route. AUM, rankings and other provider-dependent data are not part of this route.\n\n**Pagination.** Items are sorted by `curator_id`. Pass `cursor` back verbatim on the next call; a `null` cursor means the last page. The cursor is bound to the filter set that produced it, so changing filters is a 400. Pages are offsets into the live registry, so a registry change between calls can shift items across pages.\n\n**Freshness.** The registry syncs about every five minutes, lookups are cached for up to five minutes, and responses may be CDN-cached for up to five minutes.","operationId":"getCurators","parameters":[{"name":"verified","required":false,"in":"query","description":"Only curators whose registry `verified` flag matches. Omit to list verified and unverified curators.","schema":{"type":"string","enum":["true","false"]}},{"name":"chain_ids","required":false,"in":"query","description":"Only curators with at least one registered address on these chains. Defaults to every chain Core exposes.","schema":{"maxItems":100,"type":"array","items":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0,"enum":[1,8453,747474,999,42161,137,130,10,480,143,988,4217,4663,5042,196]}}},{"name":"limit","required":false,"in":"query","description":"Maximum number of curators to return.","schema":{"minimum":1,"maximum":1000,"default":100,"type":"integer"}},{"name":"cursor","required":false,"in":"query","description":"Opaque cursor from a previous page response. Bound to the filter set that produced it.","schema":{"minLength":1,"maxLength":4096,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoreCuratorListResponse"},"example":{"data":[{"curator_id":"steakhouse-financial","name":"Steakhouse Financial","image_url":"https://cdn.morpho.org/v2/assets/images/steakhouse.svg","verified":true,"addresses":[{"chain_id":1,"curator_address":"0x827e86072B06674a077f592A531dcE4590aDeCdB"},{"chain_id":8453,"curator_address":"0x0A0e559bc3b0950a7e448F0d4894db195b9cf8DD"}]}],"cursor":null}}},"description":""},"400":{"description":"Malformed or replayed cursor (`INVALID_CURSOR`), an unsupported or hidden chain id, a bad `limit`, or a non-boolean `verified`."}},"summary":"List curators","tags":["Curators"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\n\ncurl -sS \"${BASE_URL}/v0/curators\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\n\nconst url = new URL(`${baseUrl}/v0/curators`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nurl = f\"{base_url}/v0/curators\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/curators/{curator-selector}/details":{"get":{"description":"Resolve curator details using the selector `<chain_id>:<curator_address>`, where the address is the vault's on-chain `curator` role. This joins directly from Core Vault V1 and V2 responses, which remain unchanged and expose the address only.\n\n`name`, `logo_uri`, and `socials` are editorial metadata from Morpho's curator registry, `morpho-org/morpho-blue-api-metadata/data/curators-listing.json`, not on-chain facts. This is an explicit exception to Core's facts-only rule. The registry syncs about every five minutes, lookups are cached for up to five minutes, and responses may be CDN-cached for up to five minutes, so a registry change can take up to about fifteen minutes to appear.\n\nResults are every curator registry profile registered to the supplied chain and address. They are registry matches, not a verified or vault-scoped attribution: they can include unverified profiles and owner-only profiles, which the response does not distinguish. GraphQL `Vault.state.curators` / `VaultV2.curators` resolve curators per vault instead: they return none unless the vault was ever listed and its owner address has a registry profile, combine the owner's and curator's profiles, drop owner-only profiles, and fall back to the underlying V1 vault for a V2 fee wrapper. This route alone does not reproduce those vault-scoped results.\n\nA 404 means the selected chain is unsupported or not exposed by Core.","operationId":"getCuratorDetails","parameters":[{"name":"curator-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<curator_address>. Example: 1:0x827e86072B06674a077f592A531dcE4590aDeCdB.","schema":{"format":"<chain_id>:<curator_address>","example":"1:0x827e86072B06674a077f592A531dcE4590aDeCdB","type":"string"},"example":"1:0x827e86072B06674a077f592A531dcE4590aDeCdB"}],"responses":{"200":{"description":"Curator profiles registered to the selected chain and address; `curators` may be empty or hold several profiles when registry entries share an address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CoreCuratorDetailsResponse"},"example":{"data":{"chain_id":1,"curator_address":"0x827e86072B06674a077f592A531dcE4590aDeCdB","curators":[{"id":"steakhouse-financial","name":"Steakhouse Financial","logo_uri":"https://cdn.morpho.org/v2/assets/images/steakhouse.svg","socials":[{"type":"url","url":"https://www.steakhouse.financial"}]}]}}}}},"404":{"description":"The selected chain is unsupported or not exposed by Core."}},"summary":"Get curator details","tags":["Curators"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nCURATOR_SELECTOR=\"<chain_id>:<curator_address>\"\n\ncurl -sS \"${BASE_URL}/v0/curators/${CURATOR_SELECTOR}/details\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst curatorSelector = \"<chain_id>:<curator_address>\";\n\nconst url = new URL(`${baseUrl}/v0/curators/${curatorSelector}/details`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\ncurator_selector = \"<chain_id>:<curator_address>\"\nurl = f\"{base_url}/v0/curators/{curator_selector}/details\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets":{"get":{"description":"Cursor-paginated discovery list of indexed Morpho Blue markets. Rows and both sort orders use immutable market configuration from the indexer. Dynamic state is exposed by the single-market state endpoint.\n\n**Freshness.** The rows contain configuration only and may span multiple chains, so there is no single meaningful `last_indexed_block`. Use `GET /v0/chains` for per-chain indexer tips.","operationId":"MarketListController_list","parameters":[{"name":"cursor","required":false,"in":"query","description":"Opaque pagination cursor.","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":1000,"default":100,"type":"integer"}},{"name":"chain_id","required":false,"in":"query","description":"Filter to one or more EVM chain IDs.","schema":{"maxItems":100,"type":"array","items":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0}}},{"name":"loan_token","required":false,"in":"query","description":"Filter to one or more loan token asset selectors formatted as <chain_id>:<address>.","schema":{"maxItems":100,"type":"array","items":{"type":"string","description":"Selector formatted as <chain_id>:<address>. Example: 8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913.","format":"<chain_id>:<address>","example":"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}}},{"name":"collateral_token","required":false,"in":"query","description":"Filter to one collateral token address.","schema":{"type":"string"}},{"name":"collateral_tokens","required":false,"in":"query","description":"Filter to one or more collateral token addresses.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"market_id","required":false,"in":"query","description":"Filter to one or more market ids. Market ids are per chain, so combine with `chain_id` to target one chain.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"lltv_wad_gte","required":false,"in":"query","description":"Minimum `lltv_wad` (1e18 = 100%).","schema":{"pattern":"^\\d+$","type":"string"}},{"name":"lltv_wad_lte","required":false,"in":"query","description":"Maximum `lltv_wad` (1e18 = 100%).","schema":{"pattern":"^\\d+$","type":"string"}},{"name":"sort_by","required":false,"in":"query","description":"Sort key. `market_id` orders by `(chain_id, market_id)`; `lltv_wad` orders by immutable market configuration. Both break ties by `(chain_id, market_id)`.","schema":{"default":"market_id","type":"string","enum":["market_id","lltv_wad"]}},{"name":"sort_direction","required":false,"in":"query","description":"Sort direction. Defaults to `asc` for `market_id` and `desc` for every other key. `market_id` supports `asc` only.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"listed","required":false,"in":"query","description":"Filter to markets present in Morpho's public registry (`true`) or absent from it (`false`).","schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"Cursor-paginated list of Morpho Blue markets.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketListResponse"}}}}},"summary":"List markets","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nurl = f\"{base_url}/v0/blue/markets\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets/{market-selector}/liquidity":{"get":{"description":"Current Morpho Blue market liquidity and Public Allocator V2 reallocation capacity at one SDK simulation timestamp.","operationId":"MarketLiquidityController_getLiquidity","parameters":[{"name":"market-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<market_id>. Example: 1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342.","schema":{"format":"<chain_id>:<market_id>","example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","type":"string"},"example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketLiquidityResponse"}}}}},"summary":"Get market liquidity","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nMARKET_SELECTOR=\"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets/${MARKET_SELECTOR}/liquidity\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst marketSelector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets/${marketSelector}/liquidity`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nmarket_selector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nurl = f\"{base_url}/v0/blue/markets/{market_selector}/liquidity\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets/{market-selector}/public-allocator-vaults":{"get":{"description":"Public Allocator V2 candidates for a Morpho Blue market. Returns one row per vault and adapter candidate, without aggregation. Order is unspecified. Returns an empty list when the chain has no Public Allocator V2 deployment or no candidates exist.","operationId":"getBlueMarketPublicAllocatorVaults","parameters":[{"name":"market-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<market_id>. Example: 1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342.","schema":{"format":"<chain_id>:<market_id>","example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","type":"string"},"example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketPublicAllocatorVaultsResponse"},"example":{"data":[{"vault_address":"0x1111111111111111111111111111111111111111","adapter_address":"0x2222222222222222222222222222222222222222","cap_id":"0x3333333333333333333333333333333333333333333333333333333333333333","absolute_cap":"1000000000","can_pull_from_market":true,"can_pull_from_idle":false,"penalty_wad":"10000000000000000","public_allocator_address":"0x4444444444444444444444444444444444444444"}],"last_indexed_block":"19847234"}}},"description":""},"404":{"description":"Market not found"}},"summary":"Get Public Allocator V2 candidate vaults","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nMARKET_SELECTOR=\"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets/${MARKET_SELECTOR}/public-allocator-vaults\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst marketSelector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets/${marketSelector}/public-allocator-vaults`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nmarket_selector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nurl = f\"{base_url}/v0/blue/markets/{market_selector}/public-allocator-vaults\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets/{market-selector}":{"get":{"description":"Morpho Blue market configuration: loan and collateral tokens, oracle, IRM, and liquidation LTV. Values are immutable for the lifetime of the market.","operationId":"MarketRootController_getRoot","parameters":[{"name":"market-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<market_id>. Example: 1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342.","schema":{"format":"<chain_id>:<market_id>","example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","type":"string"},"example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketRootResponse"}}}}},"summary":"Get market","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nMARKET_SELECTOR=\"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets/${MARKET_SELECTOR}\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst marketSelector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets/${marketSelector}`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nmarket_selector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nurl = f\"{base_url}/v0/blue/markets/{market_selector}\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets/{market-selector}/state":{"get":{"description":"Live state of a Morpho Blue market: total supply and borrow assets, shares, fee, and AdaptiveCurveIRM rate at target.","operationId":"MarketStateController_getState","parameters":[{"name":"market-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<market_id>. Example: 1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342.","schema":{"format":"<chain_id>:<market_id>","example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","type":"string"},"example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketStateResponse"}}}}},"summary":"Get market state","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nMARKET_SELECTOR=\"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets/${MARKET_SELECTOR}/state\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst marketSelector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets/${marketSelector}/state`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nmarket_selector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nurl = f\"{base_url}/v0/blue/markets/{market_selector}/state\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets/{market-selector}/state/history":{"get":{"description":"Historical state of a Morpho Blue market: total supply and borrow assets and shares, and total collateral assets.","operationId":"MarketStateHistoryController_getStateHistory","parameters":[{"name":"market-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<market_id>. Example: 1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342.","schema":{"format":"<chain_id>:<market_id>","example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","type":"string"},"example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketStateHistoryResponse"},"example":{"params":{"chain_id":"1","market_id":"0xb323495f7e4148be5643a4ea4a8221eef163e4bccfded827a6f46947d7ad9afb"},"data":[{"timestamp":1729900800,"total_supply_assets":"119800000000000","total_supply_shares":"118300000000000000000","total_borrow_assets":"84200000000000","total_borrow_shares":"83500000000000000000","total_collateral_assets":"41500000000000000000000"},{"timestamp":1729987200,"total_supply_assets":"120500000000000","total_supply_shares":"118900000000000000000","total_borrow_assets":"85000000000000","total_borrow_shares":"84200000000000000000","total_collateral_assets":"42000000000000000000000"}],"last_indexed_block":"19847234"}}},"description":""}},"summary":"Get market state history","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nMARKET_SELECTOR=\"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets/${MARKET_SELECTOR}/state/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst marketSelector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets/${marketSelector}/state/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nmarket_selector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nurl = f\"{base_url}/v0/blue/markets/{market_selector}/state/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets/{market-selector}/apy-averages":{"get":{"description":"Average supply and borrow APYs for a Morpho Blue market over fixed historical windows on the v0 REST API. Values exclude rewards.","operationId":"MarketApyAveragesController_getApyAverages","parameters":[{"name":"market-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<market_id>. Example: 1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342.","schema":{"format":"<chain_id>:<market_id>","example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","type":"string"},"example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketApyAveragesResponseDto"},"example":{"data":{"chain_id":1,"market_id":"0xb1adceddb2941033a02dd819a3b9636a8c6f1cd1c2cd1add34e3c7b1f6c0fe25","last_indexed_block":"19847234","supply_apy_averages":{"6h":0.0425,"24h":0.0421,"7d":0.0413,"30d":0.0405,"90d":0.0398,"1y":0.0324},"borrow_apy_averages":{"6h":0.0425,"24h":0.0421,"7d":0.0413,"30d":0.0405,"90d":0.0398,"1y":0.0324}}}}},"description":""}},"summary":"Get market APY averages","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nMARKET_SELECTOR=\"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets/${MARKET_SELECTOR}/apy-averages\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst marketSelector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets/${marketSelector}/apy-averages`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nmarket_selector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nurl = f\"{base_url}/v0/blue/markets/{market_selector}/apy-averages\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets/{market-selector}/apy/history":{"get":{"description":"Historical supply and borrow APYs for a Morpho Blue market. The APY averaging window is derived automatically from lookback: one_day and seven_days use one_day; thirty_days uses seven_days; ninety_days, one_year, and inception use thirty_days. six_hours selects a six-hour result range with hourly samples and a trailing six-hour APY averaging window; the range starts at the later of creation or six hours ago, with samples starting at the next top of hour. Points that do not have enough historical data for the derived window are omitted.","operationId":"MarketApyHistoryController_getApyHistory","parameters":[{"name":"market-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<market_id>. Example: 1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342.","schema":{"format":"<chain_id>:<market_id>","example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","type":"string"},"example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically. The APY averaging window is derived automatically from lookback: one_day and seven_days use one_day; thirty_days uses seven_days; ninety_days, one_year, and inception use thirty_days. six_hours selects a six-hour result range with hourly samples and a trailing six-hour APY averaging window; the range starts at the later of creation or six hours ago, with samples starting at the next top of hour. Points that do not have enough historical data for the derived window are omitted.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception","six_hours"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketApyHistoryResponse"},"example":{"params":{"chain_id":"1","market_id":"0xb323495f7e4148be5643a4ea4a8221eef163e4bccfded827a6f46947d7ad9afb"},"data":[{"timestamp":1729900800,"supply_apy":0.0421,"borrow_apy":0.0612},{"timestamp":1729987200,"supply_apy":0.0418,"borrow_apy":0.0608}],"last_indexed_block":"19847234"}}},"description":""}},"summary":"Get market APY history","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nMARKET_SELECTOR=\"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets/${MARKET_SELECTOR}/apy/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst marketSelector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets/${marketSelector}/apy/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nmarket_selector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nurl = f\"{base_url}/v0/blue/markets/{market_selector}/apy/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/oracles/{oracle-selector}/state":{"get":{"description":"Latest indexed state of an oracle: quote, onchain update timestamp, and indexed block.","operationId":"OracleStateController_getState","parameters":[{"name":"oracle-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<oracle_address>. Example: 1:0x2a01EB9496094dA03c4E364Def50f5aD1280AD72.","schema":{"format":"<chain_id>:<oracle_address>","example":"1:0x2a01EB9496094dA03c4E364Def50f5aD1280AD72","type":"string"},"example":"1:0x2a01EB9496094dA03c4E364Def50f5aD1280AD72"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OracleStateResponse"},"example":{"data":{"last_updated_at":"1717000100","oracle_address":"0x2a01EB9496094dA03c4E364Def50f5aD1280AD72","chain_id":1,"last_indexed_block":"19700042","price":"1150750000000000000000000000000000000"}}}},"description":""}},"summary":"Get oracle state","tags":["Oracles"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nORACLE_SELECTOR=\"<chain_id>:<oracle_address>\"\n\ncurl -sS \"${BASE_URL}/v0/oracles/${ORACLE_SELECTOR}/state\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst oracleSelector = \"<chain_id>:<oracle_address>\";\n\nconst url = new URL(`${baseUrl}/v0/oracles/${oracleSelector}/state`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\noracle_selector = \"<chain_id>:<oracle_address>\"\nurl = f\"{base_url}/v0/oracles/{oracle_selector}/state\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/tokens/{token-selector}":{"get":{"description":"ERC-20 token identity and metadata: chain, address, name, symbol, decimals, logo, and tags.","operationId":"TokenRootController_getRoot","parameters":[{"name":"token-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<address>. Example: 8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913.","schema":{"format":"<chain_id>:<address>","example":"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","type":"string"},"example":"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenRootResponse"}}}}},"summary":"Get token","tags":["Token"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nTOKEN_SELECTOR=\"<chain_id>:<address>\"\n\ncurl -sS \"${BASE_URL}/v0/tokens/${TOKEN_SELECTOR}\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst tokenSelector = \"<chain_id>:<address>\";\n\nconst url = new URL(`${baseUrl}/v0/tokens/${tokenSelector}`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\ntoken_selector = \"<chain_id>:<address>\"\nurl = f\"{base_url}/v0/tokens/{token_selector}\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/tokens/{token-selector}/price":{"get":{"description":"Canonical spot price of an ERC-20 token in USD, sourced from hourly price feeds.","operationId":"TokenPriceController_getPrice","parameters":[{"name":"token-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<address>. Example: 8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913.","schema":{"format":"<chain_id>:<address>","example":"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","type":"string"},"example":"8453:0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"}],"responses":{"200":{"description":"Known token with an available USD price.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPriceResponse"}}}},"206":{"description":"Known token that the API cannot currently price. Price, timestamp, and provider are null.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPriceResponse"}}}},"404":{"description":"Token is not known by the API."}},"summary":"Get token price","tags":["Token"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nTOKEN_SELECTOR=\"<chain_id>:<address>\"\n\ncurl -sS \"${BASE_URL}/v0/tokens/${TOKEN_SELECTOR}/price\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst tokenSelector = \"<chain_id>:<address>\";\n\nconst url = new URL(`${baseUrl}/v0/tokens/${tokenSelector}/price`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\ntoken_selector = \"<chain_id>:<address>\"\nurl = f\"{base_url}/v0/tokens/{token_selector}/price\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets/{market-selector}/users/{user-address}/position":{"get":{"description":"A user's live position in a Morpho Blue market: collateral deposited, supply shares, and borrow shares.","operationId":"UserMarketPositionController_getPosition","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0x0774b5B15B0CEe5E2e14814CCF4d4611fF78CcF5.","schema":{"example":"0x0774b5B15B0CEe5E2e14814CCF4d4611fF78CcF5","type":"string","format":"address"},"example":"0x0774b5B15B0CEe5E2e14814CCF4d4611fF78CcF5"},{"name":"market-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<market_id>. Example: 1:0x15bb2a6af0c909eed19fb1f2ceeead34ecbdcba626de752c6b09389ee14eec32.","schema":{"format":"<chain_id>:<market_id>","example":"1:0x15bb2a6af0c909eed19fb1f2ceeead34ecbdcba626de752c6b09389ee14eec32","type":"string"},"example":"1:0x15bb2a6af0c909eed19fb1f2ceeead34ecbdcba626de752c6b09389ee14eec32"}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMarketPositionResponse"}}}},"404":{"description":"No position exists for the user in the selected market."}},"summary":"User market position","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nMARKET_SELECTOR=\"1:0x15bb2a6af0c909eed19fb1f2ceeead34ecbdcba626de752c6b09389ee14eec32\"\nUSER_ADDRESS=\"0x0774b5B15B0CEe5E2e14814CCF4d4611fF78CcF5\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets/${MARKET_SELECTOR}/users/${USER_ADDRESS}/position\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst marketSelector = \"1:0x15bb2a6af0c909eed19fb1f2ceeead34ecbdcba626de752c6b09389ee14eec32\";\nconst userAddress = \"0x0774b5B15B0CEe5E2e14814CCF4d4611fF78CcF5\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets/${marketSelector}/users/${userAddress}/position`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nmarket_selector = \"1:0x15bb2a6af0c909eed19fb1f2ceeead34ecbdcba626de752c6b09389ee14eec32\"\nuser_address = \"0x0774b5B15B0CEe5E2e14814CCF4d4611fF78CcF5\"\nurl = f\"{base_url}/v0/blue/markets/{market_selector}/users/{user_address}/position\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/users/{user-address}/positions":{"get":{"description":"Cursor-paginated list of a user's Morpho Blue market positions across exposed chains, one row per market the realtime position store holds for the user, listed or unlisted. By default (`active_only=true`), only positions with non-zero supply shares, borrow shares or collateral are returned. With `active_only=false`, positions the user has fully exited are also returned, with zero balances. Positions in blacklisted markets are removed from the store and never returned. Results can be filtered with chain_ids and market_ids. Pagination is weakly consistent and not snapshot-isolated: continuation pages re-evaluate realtime state, so changes to balances, active status or membership may omit or repeat rows. The response does not carry an indexed block.","operationId":"UserMarketPositionListController_list","parameters":[{"name":"user-address","required":true,"in":"path","description":"User address to list positions for. Lowercase input is checksummed. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"type":"string","example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"chain_ids","required":false,"in":"query","description":"Comma-separated EVM chain identifiers to filter on. Defaults to every exposed chain.","schema":{"maxItems":100,"type":"array","items":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0,"enum":[1,8453,747474,999,42161,137,130,10,480,143,988,4217,4663,5042,196]}}},{"name":"market_ids","required":false,"in":"query","description":"Comma-separated Morpho Blue market identifiers to filter on.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"active_only","required":false,"in":"query","description":"When true (default), excludes positions with zero supply shares, borrow shares, and collateral assets. When false, also returns fully exited positions with zero balances.","schema":{"default":"true","type":"string","enum":["true","false"]}},{"name":"sort_by","required":false,"in":"query","description":"Sort field for cursor pagination.","schema":{"default":"market_id","type":"string","enum":["market_id","supply_shares","borrow_shares","collateral_assets"]}},{"name":"sort_direction","required":false,"in":"query","description":"Sort direction.","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"limit","required":false,"in":"query","description":"Maximum number of positions to return.","schema":{"minimum":1,"maximum":100,"default":100,"type":"integer"}},{"name":"cursor","required":false,"in":"query","description":"Opaque cursor returned by a previous page. Encodes the sort field, sort direction, user address and filter set; changing any of them invalidates it. Do not parse it.","schema":{"minLength":1,"maxLength":4096,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMarketPositionsResponse"},"example":{"params":{"user_address":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},"data":[{"chain_id":1,"market_id":"0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","supply_shares":"0","borrow_shares":"45000000000000000000000","collateral_assets":"12500000000000000000"}],"cursor":null}}},"description":""}},"summary":"List user Blue positions","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/blue/users/${USER_ADDRESS}/positions\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/blue/users/${userAddress}/positions`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/blue/users/{user_address}/positions\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets/{market-selector}/users/{user-address}/position/history":{"get":{"description":"A user's historical position in a Morpho Blue market: collateral deposited, supply shares, and borrow shares.","operationId":"UserMarketPositionHistoryController_getPositionHistory","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","type":"string","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"market-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<market_id>. Example: 1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342.","schema":{"format":"<chain_id>:<market_id>","example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","type":"string"},"example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMarketPositionHistoryResponse"},"example":{"params":{"chain_id":"1","market_id":"0xb323495f7e4148be5643a4ea4a8221eef163e4bccfded827a6f46947d7ad9afb","user_address":"0x0000000000000000000000000000000000000001"},"data":[{"timestamp":1729900800,"collateral_assets":"1000000000000000000","supply_shares":"2000000000000000000","borrow_shares":"300000000000000000"},{"timestamp":1729987200,"collateral_assets":"1100000000000000000","supply_shares":"2000000000000000000","borrow_shares":"250000000000000000"}],"last_indexed_block":"19847234"}}},"description":""}},"summary":"User market position history","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nMARKET_SELECTOR=\"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets/${MARKET_SELECTOR}/users/${USER_ADDRESS}/position/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst marketSelector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets/${marketSelector}/users/${userAddress}/position/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nmarket_selector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/blue/markets/{market_selector}/users/{user_address}/position/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/blue/markets/{market-selector}/users/{user-address}/position/performance":{"get":{"description":"Average-cost realized and unrealized Morpho Blue supply earnings and borrow costs. External rewards are excluded.","operationId":"UserMarketPositionPerformanceController_getPerformance","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","type":"string","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"market-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<market_id>. Example: 1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342.","schema":{"format":"<chain_id>:<market_id>","example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","type":"string"},"example":"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserMarketPositionPerformanceResponse"},"example":{"data":{"chain_id":1,"market_id":"0xb1adceddb2941033a02dd819a3b9636a8c6f1cd1c2cd1add34e3c7b1f6c0fe25","user_address":"0x71C7656EC7ab88b098defB751B7401B5f6d8976F","last_indexed_block":"19847234","accounting_method":"average_cost","supply_net_earnings_assets":"1124530000","supply_return_on_capital":0.02249,"borrow_net_cost_assets":"82354123","borrow_cost_on_capital":0.00969}}}},"description":""}},"summary":"User market position performance","tags":["Blue"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nMARKET_SELECTOR=\"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/blue/markets/${MARKET_SELECTOR}/users/${USER_ADDRESS}/position/performance\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst marketSelector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/blue/markets/${marketSelector}/users/${userAddress}/position/performance`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nmarket_selector = \"1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342\"\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/blue/markets/{market_selector}/users/{user_address}/position/performance\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/users/{user-address}/position":{"get":{"description":"A user's live position in a Morpho Vault V1: shares held and the equivalent value in underlying assets. Returns zero shares/assets for users who have never interacted with the vault.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"UserVaultV1PositionController_getPosition","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","type":"string","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVaultV1PositionResponse"},"example":{"data":{"user_address":"0xABcdEFABcdEFabcdEfAbCdefabcdeFABcDEFabCD","chain_id":1,"vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","last_indexed_block":"25475347","shares":"0","assets":"0"}}}},"description":""}},"summary":"User V1 vault position","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/users/${USER_ADDRESS}/position\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/users/${userAddress}/position`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/users/{user_address}/position\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/users/{user-address}/positions":{"get":{"description":"Cursor-paginated discovery list of Morpho Vault V1 positions held by a user across exposed chains, including unlisted vaults. By default, only positions with non-zero shares are returned. With active_only=false, the list also returns zero-share rows for every vault in which the user has held shares, so a fully exited position stays discoverable with shares and assets of 0. Blacklisted vaults are the exception: their rows are removed from the index. Membership follows vault share Transfer events: a deposit is recorded for the share receiver, a withdrawal or redemption for the share owner, and a share transfer for both sender and recipient; an address that only sends assets on behalf of another receiver is not listed. Rows reflect the realtime position index, which is updated as those events are indexed; a position in a newly created vault appears once that vault itself has been indexed. Results can be filtered with chain_ids and vault_addresses. Pagination is weakly consistent and not snapshot-isolated: continuation pages re-evaluate realtime state, so changes to shares, assets, active status or membership may omit or repeat rows. last_indexed_block is freshness metadata only, not a pagination snapshot. Rows use the same position item shape as the singular Vault V1 user-position endpoint.","operationId":"UserVaultV1PositionListController_list","parameters":[{"name":"user-address","required":true,"in":"path","description":"User address to list positions for. Lowercase input is checksummed. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"type":"string","example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"chain_ids","required":false,"in":"query","description":"Comma-separated EVM chain identifiers to filter on. Defaults to every exposed chain.","schema":{"maxItems":100,"type":"array","items":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0,"enum":[1,8453,747474,999,42161,137,130,10,480,143,988,4217,4663,5042,196]}}},{"name":"vault_addresses","required":false,"in":"query","description":"Comma-separated vault addresses to filter on.","schema":{"maxItems":100,"type":"array","items":{"format":"address","type":"string"}}},{"name":"active_only","required":false,"in":"query","description":"When true, excludes positions with zero shares. Defaults to true.","schema":{"default":"true","type":"string","enum":["true","false"]}},{"name":"sort_by","required":false,"in":"query","description":"Sort field for cursor pagination.","schema":{"default":"vault_address","type":"string","enum":["vault_address","shares","assets"]}},{"name":"sort_direction","required":false,"in":"query","description":"Sort direction.","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"limit","required":false,"in":"query","description":"Maximum number of positions to return.","schema":{"minimum":1,"maximum":100,"default":100,"type":"integer"}},{"name":"cursor","required":false,"in":"query","description":"Opaque seek cursor (maximum 4096 characters) returned by a previous page. Do not modify it or parse it. It is unsigned and untrusted, not an authorization boundary; the user and filters are reapplied on every page, and changing the collection, sort, user or filters invalidates it.","schema":{"minLength":1,"maxLength":4096,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVaultPositionsResponse"},"example":{"params":{"user_address":"0x821b0F1A2C3d4E5f6789aBcDeF0123456789AbCd"},"data":[{"chain_id":1,"last_indexed_block":"23481902","vault_address":"0x38989BBA00BDF8181F4082995b3DEAe96163aC5D","shares":"980000000000000000000","assets":"1004300000000000000000"}],"cursor":null}}},"description":""}},"summary":"List user V1 vault positions","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/users/${USER_ADDRESS}/positions\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/users/${userAddress}/positions`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/vaults-v1/users/{user_address}/positions\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/users/{user-address}/position/activity":{"get":{"description":"Discrete, log-derived events affecting a user's share balance in a Morpho Vault V1: deposits, withdrawals, and incoming or outgoing share transfers. Every event appears exactly once, ordered by block number then log index, most recent first. The signed sum of the share amounts across the complete feed equals the shares reported by the position endpoint; it holds only from inception to a null cursor, and not for the vault's fee recipient, whose balance also grows through fee mints this endpoint does not emit. Events that do not move the share balance are omitted.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"UserVaultV1PositionActivityController_getPositionActivity","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","type":"string","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},{"name":"limit","required":false,"in":"query","description":"Maximum number of events to return.","schema":{"minimum":1,"maximum":1000,"default":100,"type":"integer"}},{"name":"cursor","required":false,"in":"query","description":"Opaque cursor returned by a previous page.","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVaultV1PositionActivityResponse"},"example":{"params":{"chain_id":1,"vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","user_address":"0x71C7656EC7ab88b098defB751B7401B5f6d8976F"},"data":[{"type":"shares_transfer_out","data":{"shares":"250000000000000000000","to_address":"0x3a9B4c5D6E7f8091A2b3c4D5E6F708192A3B4C5d"},"block_number":"19640000","tx_hash":"0x4e3a9b0ff1c2d52d7e8c5e1d3b9a8f7e6c5b4a39281706f5e4d3c2b1a09f8e7d","log_index":12,"timestamp":1712870400},{"type":"withdraw","data":{"shares":"300000000000000000000","assets":"302631578","sender":"0x71C7656EC7ab88b098defB751B7401B5f6d8976F","receiver":"0x8ba1f109551bD432803012645Ac136ddd64DBA72","on_behalf":"0x71C7656EC7ab88b098defB751B7401B5f6d8976F"},"block_number":"19600500","tx_hash":"0x1f2e3d4c5b6a798807162534435261708f9e0d1c2b3a49586776859403f2e1d0","log_index":4,"timestamp":1712396400},{"type":"shares_transfer_in","data":{"shares":"500000000000000000000","from_address":"0x8ba1f109551bD432803012645Ac136ddd64DBA72"},"block_number":"19550200","tx_hash":"0xa1b2c3d4e5f60718293a4b5c6d7e8f900112233445566778899aabbccddeeff0","log_index":88,"timestamp":1711792800},{"type":"deposit","data":{"shares":"1000000000000000000000","assets":"1000000000","sender":"0x4095F064B8d3c3548A3bebfd0Bbfd04750E30077","on_behalf":"0x71C7656EC7ab88b098defB751B7401B5f6d8976F"},"block_number":"19500100","tx_hash":"0xaabbccddeeff00112233445566778899aabbccddeeff00112233445566778899","log_index":16,"timestamp":1711191600}],"cursor":null,"last_indexed_block":"19847234"}}},"description":""}},"summary":"User V1 vault position activity","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/users/${USER_ADDRESS}/position/activity\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/users/${userAddress}/position/activity`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/users/{user_address}/position/activity\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/users/{user-address}/position/history":{"get":{"description":"A user's historical position in a Morpho Vault V1: shares held and the equivalent value in underlying assets.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"UserVaultV1PositionHistoryController_getPositionHistory","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","type":"string","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVaultV1PositionHistoryResponse"},"example":{"params":{"chain_id":"1","vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","user_address":"0x0000000000000000000000000000000000000001"},"data":[{"timestamp":1729900800,"shares":"1000000000000000000000","assets":"1012000000"},{"timestamp":1729987200,"shares":"1200000000000000000000","assets":"1221000000"}],"last_indexed_block":"19847234"}}},"description":""}},"summary":"User V1 vault position history","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/users/${USER_ADDRESS}/position/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/users/${userAddress}/position/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/users/{user_address}/position/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/users/{user-address}/position/performance":{"get":{"description":"Realized + unrealized earnings of a user's Morpho Vault V1 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). When `as_of_date` is set, the cutoff is the start of that UTC day. For an open position, valuation uses the last hourly share-price history point or the user's last position change, whichever is later, at or before the cutoff; it is not block-exact. `as_of.timestamp` is the effective valuation timestamp. For a position fully exited before the cutoff it is the last position change and the value is final. Invalid or future dates and unsupported chains return 400; unavailable history returns 503 or 404.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"UserVaultV1PositionPerformanceController_getPerformance","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","type":"string","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},{"name":"as_of_date","required":false,"in":"query","description":"UTC calendar date in YYYY-MM-DD format; returns performance through 00:00:00Z on that date. Future dates are not supported.","schema":{"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","example":"2024-05-17","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVaultV1PositionPerformanceResponse"},"example":{"data":{"user_address":"0xABcdEFABcdEFabcdEfAbCdefabcdeFABcDEFabCD","chain_id":1,"vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","last_indexed_block":"25475347","accounting_method":"average_cost","net_earnings_assets":"0","return_on_capital":null}}}},"description":""}},"summary":"User V1 vault position performance","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/users/${USER_ADDRESS}/position/performance\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/users/${userAddress}/position/performance`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/users/{user_address}/position/performance\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/users/{user-address}/position":{"get":{"description":"A user's live position in a Morpho Vault V2: shares held and the equivalent value in underlying assets.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"UserVaultV2PositionController_getPosition","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","type":"string","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVaultV2PositionResponse"},"example":{"data":{"user_address":"0xABcdEFABcdEFabcdEfAbCdefabcdeFABcDEFabCD","chain_id":1,"vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","last_indexed_block":"25475349","shares":"0","assets":"0"}}}},"description":""}},"summary":"User V2 vault position","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/users/${USER_ADDRESS}/position\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/users/${userAddress}/position`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/users/{user_address}/position\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/users/{user-address}/positions":{"get":{"description":"Cursor-paginated discovery list of Morpho Vault V2 positions held by a user across exposed chains. By default, only positions with non-zero shares are returned. With active_only=false, the list also returns zero-share rows for vaults the user has fully exited, listed or not, so it lists every Morpho Vault V2 position the realtime service has tracked for the user. Rows belong to the share holder: a deposit credits its onBehalf address and a share transfer credits its recipient; a full withdrawal, redemption or transfer out leaves the row with zero shares and zero assets. Rows update when the realtime service processes the user's Vault V2 deposit, withdrawal or transfer events; a scheduled re-sync every 10 minutes catches recently indexed events the live path missed. It scans only about the last 15 minutes of blocks before the chain head, so an event indexed after that window can stay stale until the user's next Vault V2 event or a backfill. Results can be filtered with chain_ids and vault_addresses. Fee wrappers and vaults that are not Morpho Vault V2s are not listed. Blacklisted vaults are removed eventually rather than at request time: a cleanup job deletes their position rows when the realtime scheduler starts and then every hour, so a newly blacklisted vault can stay listed until the next run. Unsupported vault adapters can stop a row from being created or refreshed, so those positions may be missing or stale. Pagination is weakly consistent and not snapshot-isolated: continuation pages re-evaluate realtime state, so changes to shares, assets, active status or membership may omit or repeat rows. last_indexed_block is freshness metadata only, not a pagination snapshot. Rows use the same position item shape as the singular Vault V2 user-position endpoint.","operationId":"UserVaultV2PositionListController_list","parameters":[{"name":"user-address","required":true,"in":"path","description":"User address to list positions for. Lowercase input is checksummed. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"type":"string","example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"chain_ids","required":false,"in":"query","description":"Comma-separated EVM chain identifiers to filter on. Defaults to every exposed chain.","schema":{"maxItems":100,"type":"array","items":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0,"enum":[1,8453,747474,999,42161,137,130,10,480,143,988,4217,4663,5042,196]}}},{"name":"vault_addresses","required":false,"in":"query","description":"Comma-separated vault addresses to filter on.","schema":{"maxItems":100,"type":"array","items":{"format":"address","type":"string"}}},{"name":"active_only","required":false,"in":"query","description":"When true, excludes positions with zero shares. Defaults to true.","schema":{"default":"true","type":"string","enum":["true","false"]}},{"name":"sort_by","required":false,"in":"query","description":"Sort field for cursor pagination.","schema":{"default":"vault_address","type":"string","enum":["vault_address","shares","assets"]}},{"name":"sort_direction","required":false,"in":"query","description":"Sort direction.","schema":{"default":"desc","type":"string","enum":["asc","desc"]}},{"name":"limit","required":false,"in":"query","description":"Maximum number of positions to return.","schema":{"minimum":1,"maximum":100,"default":100,"type":"integer"}},{"name":"cursor","required":false,"in":"query","description":"Opaque seek cursor (maximum 4096 characters) returned by a previous page. Do not modify it or parse it. It is unsigned and untrusted, not an authorization boundary; the user and filters are reapplied on every page, and changing the collection, sort, user or filters invalidates it.","schema":{"minLength":1,"maxLength":4096,"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVaultPositionsResponse"},"example":{"params":{"user_address":"0x821b0F1A2C3d4E5f6789aBcDeF0123456789AbCd"},"data":[{"chain_id":1,"last_indexed_block":"23481902","vault_address":"0xBEEFcf0BA6b4a04AB8C5B2Dd1E5c5F0E2A5F64CB","shares":"1250000000000000000000","assets":"1312500000000000000000"}],"cursor":null}}},"description":""}},"summary":"List user V2 vault positions","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/users/${USER_ADDRESS}/positions\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/users/${userAddress}/positions`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/vaults-v2/users/{user_address}/positions\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/users/{user-address}/position/history":{"get":{"description":"A user's historical position in a Morpho Vault V2: shares held and the equivalent value in underlying assets.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"UserVaultV2PositionHistoryController_getPositionHistory","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","type":"string","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVaultV2PositionHistoryResponse"},"example":{"params":{"chain_id":"1","vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","user_address":"0x0000000000000000000000000000000000000001"},"data":[{"timestamp":1729900800,"shares":"1000000000000000000000","assets":"1012000000"},{"timestamp":1729987200,"shares":"1200000000000000000000","assets":"1221000000"}],"last_indexed_block":"19847234"}}},"description":""}},"summary":"User V2 vault position history","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/users/${USER_ADDRESS}/position/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/users/${userAddress}/position/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/users/{user_address}/position/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/users/{user-address}/position/activity":{"get":{"description":"Events that changed a user's share balance in a Morpho Vault V2, newest first, one row per event log.\n\nSigns: `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.\n\n`assets` is never derived: it is present on `deposit` and `withdraw`, and absent on share transfers, whose ERC-20 log carries no asset amount.\n\nBundled 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.\n\nA self-transfer is omitted, since it changes no balance. Rows are therefore capped, not filled, by `limit`: keep paginating until `cursor` is null.\n\nCursors are bound to the selector and to the `type` filter of the request that produced them; replaying one with different filters returns 400.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"UserVaultV2PositionActivityController_getPositionActivity","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","type":"string","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},{"name":"limit","required":false,"in":"query","description":"Maximum number of event logs to read.","schema":{"minimum":1,"maximum":1000,"default":100,"type":"integer"}},{"name":"cursor","required":false,"in":"query","description":"Opaque cursor returned by a previous page.","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","description":"Restrict the feed to the given event types.","schema":{"maxItems":4,"type":"array","items":{"type":"string","enum":["deposit","withdraw","shares_transfer_in","shares_transfer_out"]}}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVaultV2PositionActivityResponse"},"example":{"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"}}},"description":""}},"summary":"User V2 vault position activity","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/users/${USER_ADDRESS}/position/activity\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/users/${userAddress}/position/activity`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/users/{user_address}/position/activity\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/users/{user-address}/position/performance":{"get":{"description":"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). When `as_of_date` is set, the cutoff is the start of that UTC day. For an open position, valuation uses the last hourly share-price history point or the user's last position change, whichever is later, at or before the cutoff; it is not block-exact. `as_of.timestamp` is the effective valuation timestamp. For a position fully exited before the cutoff it is the last position change and the value is final. Invalid or future dates and unsupported chains return 400; unavailable history returns 503 or 404.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"UserVaultV2PositionPerformanceController_getPerformance","parameters":[{"name":"user-address","required":true,"in":"path","description":"Position owner address. Example: 0xabcdefabcdefabcdefabcdefabcdefabcdefabcd.","schema":{"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd","type":"string","format":"address"},"example":"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"},{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},{"name":"as_of_date","required":false,"in":"query","description":"UTC calendar date in YYYY-MM-DD format; returns performance through 00:00:00Z on that date. Future dates are not supported.","schema":{"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","example":"2024-05-17","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserVaultV2PositionPerformanceResponse"},"example":{"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}}}},"description":""}},"summary":"User V2 vault position performance","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nUSER_ADDRESS=\"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/users/${USER_ADDRESS}/position/performance\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\nconst userAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/users/${userAddress}/position/performance`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nuser_address = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/users/{user_address}/position/performance\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1":{"get":{"description":"Cursor-paginated list of listed Morpho Vault V1 instances across every supported chain: identity, deployment facts, the performance-fee setup and the owner / curator roles. Enough to build and rank a vault directory without a follow-up call per row; `{chain-id}:{vault_address}` on each item addresses the detail routes.\n\n**Membership is gated on listing.** A V1 vault appears once it is promoted, or once a Vault V2 references it through a `MorphoVaultV1Adapter`. This is therefore not a complete enumeration of indexed Vault V1 instances, and its contents can change with no on-chain event. Unlisted vaults remain reachable through `GET /v0/vaults-v1/{chain-id}:{vault-address}`.\n\n**Roles and filters.** Roles are factual onchain configuration: owner (`owner()`), curator (`curator()`), guardian (`guardian()`) and enabled allocator (`isAllocator(address)` is true). Address lists match any address within that role (OR); different filters, including different roles, combine with AND. Allocator collections are not embedded in list items.\n\n**Not here.** Live state (`total_assets`, `share_price_ray`) is on `…/state` and APY on `…/apy`; the underlying token's name, symbol and decimals are on `GET /v0/tokens/{chain-id}:{address}`; `skim_recipient`, `timelock_seconds` and pending governance state are on the single-vault lookup.\n\n**Pagination.** Pass `cursor` back verbatim on the next call; a `null` cursor means the last page. The cursor is bound to both the sort and the filter set that produced it, so changing either is a 400 rather than a silently wrong page.\n\n**Freshness.** Every field is configuration that changes only on a governance action or a new deployment, so the payload does not move between blocks and carries no `last_indexed_block`. Use `GET /v0/chains` for per-chain indexer tips.","operationId":"getVaultsV1","parameters":[{"name":"cursor","required":false,"in":"query","description":"Opaque cursor from a previous page response. Bound to the sort and filter set that produced it.","schema":{"minLength":1,"maxLength":4096,"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Maximum number of vaults to return.","schema":{"minimum":1,"maximum":1000,"default":100,"type":"integer"}},{"name":"sort_by","required":false,"in":"query","description":"Sort key. `address` sorts on the `(chain_id, vault_address)` tiebreak. `name` compares the first 512 characters, with ties broken by chain id and vault address.","schema":{"default":"address","type":"string","enum":["address","creation_timestamp","creation_block_number","name","performance_fee_wad"]}},{"name":"sort_direction","required":false,"in":"query","description":"Sort direction. Defaults to `asc` for `address` and `name`, `desc` for `creation_timestamp`, `creation_block_number` and `performance_fee_wad`.","schema":{"type":"string","enum":["asc","desc"]}},{"name":"chain_ids","required":false,"in":"query","description":"Filter by chain ids. Required when any address filter is provided.","schema":{"maxItems":100,"type":"array","items":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0,"enum":[1,8453,747474,999,42161,137,130,10,480,143,988,4217,4663,5042,196]}}},{"name":"asset_addresses","required":false,"in":"query","description":"Filter by underlying asset address. Combine with chain_ids; lowercase input is checksummed.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"factory_addresses","required":false,"in":"query","description":"Filter by deploying factory address. Combine with chain_ids; lowercase input is checksummed.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"owners","required":false,"in":"query","description":"Filter by current owner. Combine with chain_ids; lowercase input is checksummed.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"curators","required":false,"in":"query","description":"Filter by current curator. Combine with chain_ids; lowercase input is checksummed.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"guardians","required":false,"in":"query","description":"Filter by current guardian (guardian()), factual onchain data. Combine with chain_ids; lowercase input is checksummed. Addresses within a filter combine with OR; different filters combine with AND.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"allocators","required":false,"in":"query","description":"Filter by currently enabled allocator (isAllocator(address) is true), factual onchain data, not historical or revoked permissions. Combine with chain_ids; lowercase input is checksummed. Addresses within a filter combine with OR; different filters combine with AND.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"versions","required":false,"in":"query","description":"Filter by factory lineage.","schema":{"maxItems":100,"type":"array","items":{"type":"string","enum":["1.0","1.1"]}}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV1ListResponse"},"example":{"data":[{"chain_id":1,"vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","version":"1.0","name":"Steakhouse USDC","symbol":"steakUSDC","asset_address":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","factory_address":"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101","creator_address":"0x255c7705e8BB334DfCae438197f7C4297988085a","creation_block_number":"18928285","creation_timestamp":1704500000,"performance_fee_wad":"50000000000000000","performance_fee_recipient":"0x255c7705e8BB334DfCae438197f7C4297988085a","owner":"0x0A0e559bc3b0950a7e448F0d4894db195b9cf8DD","curator":"0x827e86072B06674a077f592A531dcE4590aDeCdB","guardian":null}],"cursor":"eyJzIjoiYWRkcmVzcyIsImQiOiJhc2MiLCJ2IjoiMHhCRUVGMDE3MzVjMTMyQWRhNDZBQTlhQTRjNTQ2MjNjQUE5MkE2NENCIiwidk51bGwiOmZhbHNlLCJpIjpbMSwiMHhCRUVGMDE3MzVjMTMyQWRhNDZBQTlhQTRjNTQ2MjNjQUE5MkE2NENCIl0sImYiOiJjMmYwYTEifQ"}}},"description":""},"400":{"description":"Malformed or replayed cursor (`INVALID_CURSOR`), an unsupported chain id, a bad `limit` or `sort_by`, a malformed address, or an array / cross-product limit exceeded."}},"summary":"List V1 vaults","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nurl = f\"{base_url}/v0/vaults-v1\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}":{"get":{"description":"Morpho Vault V1 configuration: identity (name, symbol, version), underlying asset, factory, fee setup, owner/curator/guardian roles, and timelock.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV1RootController_getRoot","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV1RootResponse"},"example":{"data":{"chain_id":1,"address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","last_indexed_block":"25475346","version":"1.0","name":"Steakhouse USDC","symbol":"steakUSDC","asset":{"address":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48","decimals":6,"name":"USDCoin","symbol":"USDC"},"factory_address":"0xA9c3D3a366466Fa809d1Ae982Fb2c46E5fC41101","creator_address":"0x255c7705e8BB334DfCae438197f7C4297988085a","creation_block_number":"18928285","fee_wad":"50000000000000000","fee_recipient":"0x255c7705e8BB334DfCae438197f7C4297988085a","skim_recipient":null,"owner":"0x0A0e559bc3b0950a7e448F0d4894db195b9cf8DD","curator":"0x827e86072B06674a077f592A531dcE4590aDeCdB","guardian":"0xaa0500198B4425DfC4E272FbE42C8E64E21fc03d","timelock_seconds":604800}}}},"description":""}},"summary":"Get V1 vault","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/allocators":{"get":{"description":"Active allocator addresses for a Morpho Vault V1 and the transaction hash and block number of each latest role grant.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"getVaultsV1Allocators","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultRoleListResponse"},"example":{"params":{"chain_id":1,"vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},"data":[{"role_address":"0x0000aeB716a0DF7A9A1AAd119b772644Bc089dA8","tx_hash":"0x8ef18dd4c5ef94344d30852f61e3abb1ad6c7cc4deee3cb0b032598515ec3164","grant_block_number":"23335802"}],"last_indexed_block":"25501833"}}},"description":""}},"summary":"Get V1 vault allocators","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/allocators\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/allocators`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/allocators\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/state":{"get":{"description":"Live state of a Morpho Vault V1: total assets and shares, and withdrawable assets.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV1StateController_getState","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV1StateResponse"},"example":{"data":{"chain_id":1,"address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","last_indexed_block":"25475347","total_assets":"94526725305307","total_supply":"83501720602903970503901222","withdrawable_assets":"52824490248986","share_price_ray":"1132033263779470871876688077"}}}},"description":""}},"summary":"Get V1 vault state","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/state\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/state`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/state\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/state/history":{"get":{"description":"Historical state of a Morpho Vault V1: total assets and shares, withdrawable assets, and share price.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV1StateHistoryController_getStateHistory","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV1StateHistoryResponse"},"example":{"params":{"chain_id":"1","vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},"data":[{"timestamp":1729900800,"total_assets":"82710000000000","total_supply":"81700000000000000000000","withdrawable_assets":"9100000000000","share_price_ray":"1012363526315789473000000000"},{"timestamp":1729987200,"total_assets":"83140000000000","total_supply":"81700000000000000000000","withdrawable_assets":"9300000000000","share_price_ray":"1017625458996328029000000000"}],"last_indexed_block":"19847234"}}},"description":""}},"summary":"Get V1 vault state history","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/state/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/state/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/state/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/allocations/history":{"get":{"description":"Historical allocation state of a Morpho Vault V1 grouped by market: supplied assets, supplied shares, and supply cap.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV1AllocationHistoryController_getAllocationHistory","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"type":"string"}},{"name":"market_id","required":false,"in":"query","description":"Optional Morpho Blue market id filter.","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV1AllocationHistoryResponse"},"example":{"params":{"chain_id":"1","vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},"data":[{"market_id":"0xb323495f7e4148be5643a4ea4a8221eef163e4bccfded827a6f46947d7ad9afb","history":[{"timestamp":1729900800,"supply_assets":"51200000000000","supply_shares":"51000000000000000000000","supply_cap":"100000000000000"},{"timestamp":1729987200,"supply_assets":"52500000000000","supply_shares":"52300000000000000000000","supply_cap":"100000000000000"}]}],"last_indexed_block":"19847234"}}},"description":""}},"summary":"Get V1 vault allocation history","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/allocations/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/allocations/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/allocations/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/allocations":{"get":{"description":"Current market allocation state of a Morpho Vault V1, including timelocked per-market cap changes and market removals. Covers every market with a current or pending relationship to the vault, ordered by ascending market id.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV1AllocationsController_getAllocations","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV1AllocationsResponse"},"example":{"data":{"chain_id":1,"vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","last_indexed_block":"19847234","allocations":[{"market_id":"0xb323495f7e4148be5643a4ea4a8221eef163e4bccfded827a6f46947d7ad9afb","supply_assets":"62500000000000","supply_shares":"61800000000000000","supply_cap":"24519928653854221733733552434404946937899825954937634815","supply_queue_index":0,"withdraw_queue_index":2,"pending":{"supply_cap":null,"removal":null}},{"market_id":"0xc54d7acf14de29e0e5527cabd7a576506870346a78a11a6762e2cca66322ec41","supply_assets":"20000000000000","supply_shares":"19800000000000000","supply_cap":"30000000000000","supply_queue_index":1,"withdraw_queue_index":0,"pending":{"supply_cap":null,"removal":{"valid_at_timestamp":1730259200}}},{"market_id":"0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342","supply_assets":"0","supply_shares":"0","supply_cap":"0","supply_queue_index":null,"withdraw_queue_index":null,"pending":{"supply_cap":{"value":"10000000000000","valid_at_timestamp":1730172800},"removal":null}}]}}}},"description":""}},"summary":"Get V1 vault allocations","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/allocations\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/allocations`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/allocations\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/apy-averages":{"get":{"description":"Realized average APY of a Morpho Vault V1 over a predefined lookback period, derived from share price evolution. Post-fee, excludes rewards.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV1ApyAveragesController_getApyAverages","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},{"name":"lookback","required":false,"in":"query","description":"Lookback period for the APY calculation. Defaults to `six_hours`.","schema":{"enum":["one_hour","six_hours","one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV1ApyAveragesResponse"},"example":{"data":{"chain_id":1,"vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","last_indexed_block":"25475347","lookback":"six_hours","apy":0.03172317044232895}}}},"description":""}},"summary":"Get V1 vault realized average APY","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/apy-averages?lookback=six_hours\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/apy-averages`);\nurl.searchParams.set(\"lookback\", \"six_hours\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/apy-averages\"\nparams = {\"lookback\": \"six_hours\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/apy/history":{"get":{"description":"Historical APY for a Morpho Vault V1. The APY averaging window is derived automatically from lookback: one_day and seven_days use one_day; thirty_days uses seven_days; ninety_days, one_year, and inception use thirty_days. six_hours selects a six-hour result range with hourly samples and a trailing six-hour APY averaging window; the range starts at the later of creation or six hours ago, with samples starting at the next top of hour. A point closer to the vault's first hourly snapshot than its window averages from that snapshot instead; points less than one day after it are omitted, except six_hours requires at least six hours after that snapshot.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV1ApyHistoryController_getApyHistory","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically. The APY averaging window is derived automatically from lookback: one_day and seven_days use one_day; thirty_days uses seven_days; ninety_days, one_year, and inception use thirty_days. six_hours selects a six-hour result range with hourly samples and a trailing six-hour APY averaging window; the range starts at the later of creation or six hours ago, with samples starting at the next top of hour. A point closer to the vault's first hourly snapshot than its window averages from that snapshot instead; points less than one day after it are omitted, except six_hours requires at least six hours after that snapshot.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception","six_hours"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV1ApyHistoryResponse"},"example":{"params":{"chain_id":"1","vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},"data":[{"timestamp":1729900800,"apy":0.0317},{"timestamp":1729987200,"apy":0.0321}],"last_indexed_block":"19847234"}}},"description":""}},"summary":"Get V1 vault APY history","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/apy/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/apy/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/apy/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v1/{vault-selector}/pending-governance-actions":{"get":{"description":"Pending governance actions for a Morpho Vault V1, including timelocked cap increases, timelock decreases, guardian changes, market removals, and pending ownership transfers.\n\nVault selector example: `1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV1PendingGovernanceActionsController_getPendingGovernanceActions","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB","type":"string"},"example":"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":1000,"default":100,"type":"integer"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV1PendingGovernanceActionsResponse"},"example":{"params":{"chain_id":1,"vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},"data":[{"action_type":"set_cap","parameters":{"market_id":"0x3a85e619751152991742810df6ec69ce473daef99e28a64ab2340d7b7ccfee49","new_supply_cap":"1000000000000"},"submitted_transaction_hash":"0x1111111111111111111111111111111111111111111111111111111111111111","executable_at_timestamp":1730086400},{"action_type":"set_timelock","parameters":{"new_timelock_seconds":86400},"submitted_transaction_hash":"0x2222222222222222222222222222222222222222222222222222222222222222","executable_at_timestamp":1730086400},{"action_type":"set_guardian","parameters":{"new_guardian":"0x4b6Cb9Cf2A3C4cD8b3F8bF8E2Cb5B7d4C0F2Ee99"},"submitted_transaction_hash":"0x3333333333333333333333333333333333333333333333333333333333333333","executable_at_timestamp":1730086400},{"action_type":"remove_market","parameters":{"market_id":"0x3a85e619751152991742810df6ec69ce473daef99e28a64ab2340d7b7ccfee49"},"submitted_transaction_hash":"0x4444444444444444444444444444444444444444444444444444444444444444","executable_at_timestamp":1730086400},{"action_type":"transfer_ownership","parameters":{"pending_owner":"0x4b6Cb9Cf2A3C4cD8b3F8bF8E2Cb5B7d4C0F2Ee99"},"submitted_transaction_hash":"0x5555555555555555555555555555555555555555555555555555555555555555","executable_at_timestamp":null}],"cursor":null,"last_indexed_block":"19847234"}}},"description":""}},"summary":"Get V1 vault pending governance actions","tags":["Vaults V1"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v1/${VAULT_SELECTOR}/pending-governance-actions\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v1/${vaultSelector}/pending-governance-actions`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB\"\nurl = f\"{base_url}/v0/vaults-v1/{vault_selector}/pending-governance-actions\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2":{"get":{"description":"Cursor-paginated discovery list of the listed Morpho Vault V2 instances across all exposed chains. Rows carry vault identity, underlying asset, factory, creation parameters, fees and the owner and curator roles — enough to build a vault picker and to construct the <chain_id>:<vault_address> selector for every per-vault route. Live state, APY and allocations are served by the per-vault endpoints.","operationId":"VaultV2ListController_list","parameters":[{"name":"cursor","required":false,"in":"query","description":"Opaque cursor returned by a previous page. Encodes the sort field, the sort direction and the filter set; changing any of them invalidates it. Do not parse it.","schema":{"minLength":1,"maxLength":4096,"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Maximum number of vaults to return.","schema":{"minimum":1,"maximum":1000,"default":100,"type":"integer"}},{"name":"chain_ids","required":false,"in":"query","description":"Comma-separated EVM chain identifiers to filter on. Defaults to every exposed chain. A chain that is unsupported or not exposed is rejected.","schema":{"maxItems":100,"type":"array","items":{"type":"integer","exclusiveMinimum":true,"maximum":9007199254740991,"minimum":0,"enum":[1,8453,747474,999,42161,137,130,10,480,143,988,4217,4663,5042,196]}}},{"name":"asset_addresses","required":false,"in":"query","description":"Comma-separated underlying asset addresses to filter on.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"owners","required":false,"in":"query","description":"Comma-separated owner addresses to filter on.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"curators","required":false,"in":"query","description":"Comma-separated curator addresses to filter on.","schema":{"maxItems":100,"type":"array","items":{"type":"string"}}},{"name":"sort_by","required":false,"in":"query","description":"Sort field. `name` is the only nullable key and always sorts nulls last; it compares the first 512 characters, with ties broken by chain id and vault address.","schema":{"default":"vault_address","type":"string","enum":["vault_address","name","creation_timestamp","creation_block_number","management_fee_wad","performance_fee_wad"]}},{"name":"sort_direction","required":false,"in":"query","description":"Sort direction.","schema":{"default":"asc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV2ListResponse"},"example":{"data":[{"chain_id":1,"vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","version":"2.0","name":"sky.money USDT Savings","symbol":"skyMoneyUsdtSavings","asset_address":"0xdAC17F958D2ee523a2206206994597C13D831ec7","factory_address":"0xA1D94F746dEfa1928926b84fB2596c06926C0405","creation_block_number":"24568955","creation_timestamp":1776950399,"management_fee_wad":null,"management_fee_recipient":null,"performance_fee_wad":"100000000000000000","performance_fee_recipient":"0x3F32bC09d41eE699844F8296e806417D6bf61Bba","owner":"0x3F32bC09d41eE699844F8296e806417D6bf61Bba","curator":"0x3F32bC09d41eE699844F8296e806417D6bf61Bba"}],"cursor":null}}},"description":""}},"summary":"List V2 vaults","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nurl = f\"{base_url}/v0/vaults-v2\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}":{"get":{"description":"Morpho Vault V2 configuration: identity, underlying asset, factory, management/performance fees, owner and curator roles, per-function timelocks and abdications, adapter registry, liquidity adapter, and gating contracts.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV2RootController_getRoot","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV2RootResponse"},"example":{"data":{"chain_id":1,"address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","last_indexed_block":"25475349","version":"2.0","name":"sky.money USDT Savings","symbol":"skyMoneyUsdtSavings","asset":{"address":"0xdAC17F958D2ee523a2206206994597C13D831ec7","decimals":6,"name":"Tether USD","symbol":"USDT"},"decimals_offset":12,"factory_address":"0xA1D94F746dEfa1928926b84fB2596c06926C0405","creation_block_number":"24568955","owner":"0x3F32bC09d41eE699844F8296e806417D6bf61Bba","curator":"0x3F32bC09d41eE699844F8296e806417D6bf61Bba","timelock_seconds":604800,"governance":{"timelocks":[{"function_name":"setIsAllocator","timelock_seconds":"604800","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"setReceiveSharesGate","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"setSendSharesGate","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"setReceiveAssetsGate","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"setSendAssetsGate","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"setAdapterRegistry","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"addAdapter","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"removeAdapter","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"increaseTimelock","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"decreaseTimelock","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"setPerformanceFee","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"setManagementFee","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"setPerformanceFeeRecipient","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"setManagementFeeRecipient","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"increaseAbsoluteCap","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"increaseRelativeCap","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"setForceDeallocatePenalty","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null},{"function_name":"abdicate","timelock_seconds":"0","is_abdicated":false,"abdicated_at_timestamp":null}]},"management_fee_wad":null,"management_fee_recipient":null,"performance_fee_wad":null,"performance_fee_recipient":null,"max_rate_per_second_wad":"63419583967","adapter_registry":"0x3696c5eAe4a7Ffd04Ea163564571E9CD8Ed9364e","liquidity_adapter":"0x6C5D5D47A39FE9f8CA14731a9A42bD31d64fb40D","liquidity_data":"0x3274643db77a064abd3bc851de77556a4ad2e2f502f4f0c80845fa8f909ecf0b","gates":{"send_shares":null,"receive_shares":null,"send_assets":null,"receive_assets":null}}}}},"description":""}},"summary":"Get V2 vault","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/allocators":{"get":{"description":"Active allocator addresses for a Morpho Vault V2 and the transaction hash and block number of each latest role grant.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"getVaultsV2Allocators","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultRoleListResponse"},"example":{"params":{"chain_id":1,"vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},"data":[{"role_address":"0x3F32bC09d41eE699844F8296e806417D6bf61Bba","tx_hash":"0x55105b7f237a881f96b372475578aa8b237fc76d20371499b69104e00c0086ca","grant_block_number":"24569063"}],"last_indexed_block":"25501833"}}},"description":""}},"summary":"Get V2 vault allocators","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/allocators\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/allocators`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/allocators\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/sentinels":{"get":{"description":"Active sentinel addresses for a Morpho Vault V2 and the transaction hash and block number of each latest role grant.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"getVaultsV2Sentinels","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultRoleListResponse"},"example":{"params":{"chain_id":1,"vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},"data":[{"role_address":"0x3F32bC09d41eE699844F8296e806417D6bf61Bba","tx_hash":"0xcf8980c0f540e8965d9b25fe39e89c4abada2ced9d8a5ebbc69ed1395a05f25c","grant_block_number":"24569065"}],"last_indexed_block":"25501833"}}},"description":""}},"summary":"Get V2 vault sentinels","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/sentinels\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/sentinels`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/sentinels\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v1/vaults-v2/{vault-selector}/state":{"get":{"description":"Live state of a Morpho Vault V2: total assets and shares, withdrawable assets, allocated assets, and idle assets.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV2StateController_getState","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV2StateResponse"},"example":{"data":{"chain_id":1,"address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","last_indexed_block":"25475349","last_accrual_timestamp":1783363079,"total_assets":"64630689825420","total_supply":"63983179535078553542936844","withdrawable_assets":"8833322907237","allocated_assets":"64630689825420","idle_assets":"0","share_price_ray":"1010120008024709698799907272"}}}},"description":""}},"summary":"Get V2 vault state","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v1/vaults-v2/${VAULT_SELECTOR}/state\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v1/vaults-v2/${vaultSelector}/state`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v1/vaults-v2/{vault_selector}/state\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/state/history":{"get":{"description":"Historical state of a Morpho Vault V2: total assets and shares, withdrawable assets, allocated assets, idle assets, and share price.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV2StateHistoryController_getStateHistory","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV2StateHistoryResponse"},"example":{"params":{"chain_id":"1","vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},"data":[{"timestamp":1729900800,"total_assets":"92000000000000","total_supply":"91200000000000000000000","withdrawable_assets":"12500000000000","allocated_assets":"79500000000000","idle_assets":"12500000000000","share_price_ray":"1008771929824561403000000000"},{"timestamp":1729987200,"total_assets":"92300000000000","total_supply":"91200000000000000000000","withdrawable_assets":"13100000000000","allocated_assets":"79200000000000","idle_assets":"13100000000000","share_price_ray":"1012061403508771929000000000"}],"last_indexed_block":"19847234"}}},"description":""}},"summary":"Get V2 vault state history","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/state/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/state/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/state/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/caps/history":{"get":{"description":"Historical allocation and cap state of a Morpho Vault V2 grouped by cap.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV2CapsHistoryController_getCapsHistory","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"type":"string"}},{"name":"cap_id","required":false,"in":"query","description":"Optional Vault V2 cap id filter.","schema":{"pattern":"^0x[a-fA-F0-9]{64}$","type":"string"}},{"name":"cap_type","required":false,"in":"query","description":"Optional Vault V2 cap type filter.","schema":{"enum":["adapter","collateral","marketV1","unknown"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV2CapsHistoryResponse"},"example":{"params":{"chain_id":"1","vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},"data":[{"cap_id":"0x5c1f2a8a1c9b2f6a4c4b0e4e6f0a7a3d2c1b0a9f8e7d6c5b4a3f2e1d0c9b8a7f","cap_type":"adapter","adapter_address":"0xFc98D101F6E2F7C27DB2bAEf7D803298F0e0043C","target":{"type":"vault_v1","vault_address":"0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"},"history":[{"timestamp":1729900800,"allocation":"12000000000000","absolute_cap":"50000000000000","relative_cap_wad":"300000000000000000","relative_allocation":0.12}]},{"cap_id":"0x0a14a2d85b0d8b52f0991fdc2d47e9c469a70735c084f99f74d0113dd4b61899","cap_type":"marketV1","adapter_address":"0x6C5D5D47A39FE9f8CA14731a9A42bD31d64fb40D","market_id":"0xa5c50bd6e28de8b098defa897f677798f3f256959c2d47dabe8c5994ff53d8fd","collateral_address":"0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0","history":[{"timestamp":1729900800,"allocation":"46000000000000","absolute_cap":"100000000000000","relative_cap_wad":"600000000000000000","relative_allocation":0.46},{"timestamp":1729987200,"allocation":"47500000000000","absolute_cap":"100000000000000","relative_cap_wad":"600000000000000000","relative_allocation":0.475}]}],"last_indexed_block":"25475349"}}},"description":""}},"summary":"Get V2 vault caps history","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/caps/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/caps/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/caps/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/allocations":{"get":{"description":"Adapter and cap allocation state of a Morpho Vault V2. Each entry is an active adapter, carrying the caps scoped to it and the assets currently allocated against each. Caps that are not scoped to a single adapter — collateral caps, and caps whose target could not be decoded — are reported separately under unscoped_caps. Caps pointing at an adapter that is no longer active are omitted.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"getVaultsV2Allocations","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV2AllocationsResponse"},"example":{"data":{"chain_id":1,"vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","last_indexed_block":"25475349","allocations":[{"adapter_address":"0x6C5D5D47A39FE9f8CA14731a9A42bD31d64fb40D","adapter_kind":"morpho_market_v1","target":{"type":"blue_market"},"pending":{"removal":null},"caps":[{"cap_type":"adapter","cap_id":"0xae24ee5060e52617daf39855191a6b07eb5921e80260e655a7948b507fa3956c","cap_data":"0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000006c5d5d47a39fe9f8ca14731a9a42bd31d64fb40d00000000000000000000000000000000000000000000000000000000000000047468697300000000000000000000000000000000000000000000000000000000","allocated_assets":"46000000000000","real_assets":"46012500000000","absolute_cap":"115792089237316195423570985008687907853269984665640564039457584007913129639935","relative_cap_wad":"1000000000000000000","pending":{"absolute_cap":null,"relative_cap_wad":null}},{"cap_type":"market_v1","cap_id":"0x1748c76027999bc7f3df33d1872ada5ac024707b6a700327037bacf7decc1e72","cap_data":"0x00000000000000000000000000000000000000000000000000000000000000e00000000000000000000000006c5d5d47a39fe9f8ca14731a9a42bd31d64fb40d000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca000000000000000000000000048f7e36eb6b826b2df4b2e630b62cd25e89e40e2000000000000000000000000870ac11d48b15db9a138cf899d20f13f79ba00bc0000000000000000000000000000000000000000000000000bef55718ad600000000000000000000000000000000000000000000000000000000000000000011746869732f6d61726b6574506172616d73000000000000000000000000000000","market_id":"0xa5c50bd6e28de8b098defa897f677798f3f256959c2d47dabe8c5994ff53d8fd","allocated_assets":"46000000000000","expected_supply_assets":"46012500000000","absolute_cap":"100000000000000","relative_cap_wad":"600000000000000000","pending":{"absolute_cap":null,"relative_cap_wad":{"value":"650000000000000000","valid_at_timestamp":1730259200}}}]},{"adapter_address":"0x1122334455667788990011223344556677889900","adapter_kind":"morpho_vault_v1","target":{"type":"vault_v1","vault_address":"0xb576765fB15505433aF24FEe2c0325895C559FB2"},"pending":{"removal":{"valid_at_timestamp":1730345600}},"caps":[{"cap_type":"adapter","cap_id":"0x6a9c9d91305f96fadf8665e7c7f702d152168ae534b03dc5163db557448c2030","cap_data":"0x0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000112233445566778899001122334455667788990000000000000000000000000000000000000000000000000000000000000000047468697300000000000000000000000000000000000000000000000000000000","allocated_assets":"18630689825420","real_assets":"18631704120911","absolute_cap":"300000000000000","relative_cap_wad":"300000000000000000","pending":{"absolute_cap":{"value":"500000000000000","valid_at_timestamp":1730259200},"relative_cap_wad":null}}]}],"unscoped_caps":[{"cap_type":"collateral","cap_id":"0x7fec14a26d24d99916f8800202b21d034d3b543349fc0e6632a4bd78a2891a20","cap_data":"0x00000000000000000000000000000000000000000000000000000000000000400000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0000000000000000000000000000000000000000000000000000000000000000f636f6c6c61746572616c546f6b656e0000000000000000000000000000000000","collateral_address":"0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0","allocated_assets":"46000000000000","absolute_cap":"80000000000000","relative_cap_wad":"800000000000000000","pending":{"absolute_cap":null,"relative_cap_wad":null}}]}}}},"description":""}},"summary":"Get V2 vault allocations","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/allocations\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/allocations`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/allocations\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v1/vaults-v2/{vault-selector}/apy-averages":{"get":{"description":"Realized average APY of a Morpho Vault V2 over a predefined lookback period, derived from share price evolution.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV2ApyAveragesController_getApyAverages","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},{"name":"lookback","required":false,"in":"query","description":"Lookback period for the APY calculation. Defaults to `six_hours`.","schema":{"enum":["one_hour","six_hours","one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV2ApyAveragesResponse"},"example":{"data":{"chain_id":1,"vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","last_indexed_block":"25475349","lookback":"six_hours","apy":0.021513718810443165}}}},"description":""}},"summary":"Get V2 vault realized average APY","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v1/vaults-v2/${VAULT_SELECTOR}/apy-averages?lookback=six_hours\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v1/vaults-v2/${vaultSelector}/apy-averages`);\nurl.searchParams.set(\"lookback\", \"six_hours\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v1/vaults-v2/{vault_selector}/apy-averages\"\nparams = {\"lookback\": \"six_hours\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/apy/history":{"get":{"description":"Historical APY for a Morpho Vault V2. The APY averaging window is derived automatically from lookback: one_day and seven_days use one_day; thirty_days uses seven_days; ninety_days, one_year, and inception use thirty_days. six_hours selects a six-hour result range with hourly samples and a trailing six-hour APY averaging window; the range starts at the later of creation or six hours ago, with samples starting at the next top of hour. A point closer to the vault's first hourly snapshot than its window averages from that snapshot instead; points less than one day after it are omitted, except six_hours requires at least six hours after that snapshot.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV2ApyHistoryController_getApyHistory","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},{"name":"lookback","required":false,"in":"query","description":"Lookback period. Defaults to thirty_days. Historical sampling is selected automatically. The APY averaging window is derived automatically from lookback: one_day and seven_days use one_day; thirty_days uses seven_days; ninety_days, one_year, and inception use thirty_days. six_hours selects a six-hour result range with hourly samples and a trailing six-hour APY averaging window; the range starts at the later of creation or six hours ago, with samples starting at the next top of hour. A point closer to the vault's first hourly snapshot than its window averages from that snapshot instead; points less than one day after it are omitted, except six_hours requires at least six hours after that snapshot.","schema":{"enum":["one_day","seven_days","thirty_days","ninety_days","one_year","inception","six_hours"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV2ApyHistoryResponse"},"example":{"params":{"chain_id":"1","vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},"data":[{"timestamp":1729900800,"apy":0.0215},{"timestamp":1729987200,"apy":0.0219}],"last_indexed_block":"19847234"}}},"description":""}},"summary":"Get V2 vault APY history","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/apy/history?lookback=thirty_days\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/apy/history`);\nurl.searchParams.set(\"lookback\", \"thirty_days\");\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/apy/history\"\nparams = {\"lookback\": \"thirty_days\"}\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/pending-governance-actions":{"get":{"description":"Pending governance actions for a Morpho Vault V2, decoded from the on-chain timelock submit calldata. Unknown selectors are returned with null parameters.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV2PendingGovernanceActionsController_getPendingGovernanceActions","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":1000,"default":100,"type":"integer"}},{"name":"cursor","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV2PendingGovernanceActionsResponse"},"example":{"params":{"chain_id":1,"vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"},"data":[{"action_type":"set_is_allocator","parameters":{"account":"0x3F32bC09d41eE699844F8296e806417D6bf61Bba","is_allocator":true},"submitted_transaction_hash":"0x1111111111111111111111111111111111111111111111111111111111111111","executable_at_timestamp":1730086400},{"action_type":"increase_timelock","parameters":{"selector":"0xf6f98fd5","new_duration_seconds":"604800"},"submitted_transaction_hash":"0x2222222222222222222222222222222222222222222222222222222222222222","executable_at_timestamp":1730086400},{"action_type":"increase_absolute_cap","parameters":{"id_data":"0x1234","new_absolute_cap":"1000000000"},"submitted_transaction_hash":"0x3333333333333333333333333333333333333333333333333333333333333333","executable_at_timestamp":1730086400},{"action_type":"unknown","parameters":null,"submitted_transaction_hash":"0x4444444444444444444444444444444444444444444444444444444444444444","executable_at_timestamp":1730172800}],"cursor":null,"last_indexed_block":"19847234"}}},"description":""}},"summary":"Get V2 vault pending governance actions","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/pending-governance-actions\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/pending-governance-actions`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/pending-governance-actions\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}},"/v0/vaults-v2/{vault-selector}/withdrawal-options":{"get":{"description":"Immediately available assets and adapter-level force-deallocation capacity and penalty rates for a Morpho Vault V2.\n\nVault selector example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11` (format: `<chain_id>:<vault_address>`; replace with the target vault).","operationId":"VaultV2WithdrawalOptionsController_getWithdrawalOptions","parameters":[{"name":"vault-selector","required":true,"in":"path","description":"Selector formatted as <chain_id>:<vault_address>. Example: 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","schema":{"format":"<chain_id>:<vault_address>","example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","type":"string"},"example":"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11"}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VaultV2WithdrawalOptionsResponse"},"example":{"data":{"chain_id":1,"vault_address":"0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11","liquidity_adapter_available_assets":"12500000000000","idle_assets":"12500000000000","adapter_penalties":[{"adapter_address":"0x1111111111111111111111111111111111111111","adapter_kind":"blue_market_adapter","force_deallocatable_assets":"60000000000000","penalty_rate_wad":"5000000000000000"}]}}}},"description":""}},"summary":"Get V2 vault withdrawal options","tags":["Vaults V2"],"x-codeSamples":[{"lang":"bash","label":"cURL","source":"BASE_URL=\"${CORE_REST_BASE_URL:-https://api.morpho.org}\"\nMORPHO_API_KEY=\"<MORPHO_API_KEY>\"\nVAULT_SELECTOR=\"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\n\ncurl -sS \"${BASE_URL}/v0/vaults-v2/${VAULT_SELECTOR}/withdrawal-options\" \\\n  -H \"accept: application/json\" \\\n  -H \"x-api-key: ${MORPHO_API_KEY}\""},{"lang":"typescript","label":"TypeScript","source":"const baseUrl = process.env.CORE_REST_BASE_URL ?? \"https://api.morpho.org\";\nconst apiKey = process.env.MORPHO_API_KEY ?? \"<MORPHO_API_KEY>\";\nconst vaultSelector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\";\n\nconst url = new URL(`${baseUrl}/v0/vaults-v2/${vaultSelector}/withdrawal-options`);\n\nconst response = await fetch(url, {\n  headers: {\n    accept: \"application/json\",\n    \"x-api-key\": apiKey,\n  },\n});\nif (!response.ok) throw new Error(await response.text());\n\nconst body = await response.json();"},{"lang":"python","label":"Python","source":"import os\nimport requests\n\nbase_url = os.environ.get(\"CORE_REST_BASE_URL\", \"https://api.morpho.org\")\napi_key = os.environ.get(\"MORPHO_API_KEY\", \"<MORPHO_API_KEY>\")\nvault_selector = \"1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11\"\nurl = f\"{base_url}/v0/vaults-v2/{vault_selector}/withdrawal-options\"\nparams = None\n\nresponse = requests.get(url, headers={\n    \"accept\": \"application/json\",\n    \"x-api-key\": api_key,\n}, params=params, timeout=30)\nresponse.raise_for_status()\n\nbody = response.json()"}]}}},"info":{"title":"Core REST API","description":"REST API exposing core Morpho on-chain entity state and configuration.\n\n### Authentication\n\nUse the `x-api-key` header for key-authenticated/private flows.\n\n```bash\ncurl -sS https://private.api.morpho.org/graphql \\\n  -H \"content-type: application/json\" \\\n  -H \"x-api-key: <MORPHO_API_KEY>\" \\\n  --data '{\"query\":\"{ __typename }\"}'\n```\n\n### Selectors\n\nVault selectors use `<chain_id>:<vault_address>` syntax. Example: `1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11`.\n","version":"1.0","contact":{}},"tags":[],"servers":[{"url":"https://api.morpho.org","description":"Morpho API"}],"components":{"schemas":{"BlockTimestampResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"block_number":{"description":"Block number.","type":"string","internalType":"bigint"},"block_hash":{"type":"string","description":"Block hash."},"timestamp":{"type":"integer","exclusiveMinimum":true,"description":"Block timestamp, in unix seconds.","minimum":0}},"required":["chain_id","block_hash","timestamp"],"description":"Block timestamp."}},"required":["data"]},"ChainsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"name":{"type":"string","description":"Human-readable chain name."},"last_indexed_block":{"type":"string","internalType":"bigint","description":"Last block fully processed by all realtime service jobs for this chain. Null when no realtime processing has been recorded yet.","nullable":true},"supported_protocols":{"type":"array","items":{"type":"string","enum":["blue","vault-v1","vault-v2","midnight","preliquidation"]},"description":"Morpho protocols deployed on the chain."}},"required":["chain_id","name","supported_protocols"]},"description":"Supported EVM chains."}},"required":["data"]},"CoreCuratorListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"curator_id":{"type":"string","description":"Stable curator registry ID. Approved Global registry metadata, not an on-chain fact; matches `id` on the curator details route."},"name":{"type":"string","description":"Editorial curator display name from the registry."},"image_url":{"type":"string","description":"Editorial curator logo URL from the registry. Null when the registry has no image.","nullable":true},"verified":{"type":"boolean","description":"Registry verification flag set by Morpho. Approved Global registry metadata, not an on-chain fact."},"addresses":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"Chain the curator address is registered on.","minimum":0},"curator_address":{"description":"Checksummed address registered to the curator on this chain. Pass `{chain_id}:{curator_address}` to `GET /v0/curators/{curator-selector}/details` for socials.","type":"string"}},"required":["chain_id","curator_address"]},"description":"Every address registered to the curator on a chain Core exposes, one entry per chain and address, sorted by chain then address. Not narrowed by `chain_ids`."}},"required":["curator_id","name","image_url","verified","addresses"]},"description":"Page of curator registry identities, sorted by `curator_id`."},"cursor":{"type":"string","description":"Opaque cursor for the next page. Null on the last page.","nullable":true}},"required":["data","cursor"]},"CoreCuratorDetailsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"Chain of the selected curator address.","minimum":0},"curator_address":{"description":"Checksummed on-chain curator role address selected by the path.","type":"string"},"curators":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable curator registry ID; distinguishes multiple profiles registered to one address."},"name":{"type":"string","description":"Editorial curator display name from the registry."},"logo_uri":{"type":"string","description":"Editorial curator logo URI from the registry. Null when the registry has no image.","nullable":true},"socials":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Social-link type key from the curator registry."},"url":{"type":"string","description":"Social link URL."}},"required":["type","url"]},"description":"Editorial curator social links from the registry; empty when none."}},"required":["id","name","logo_uri","socials"]},"description":"Every curator registry profile registered to this chain and address, sorted by registry `id`; empty when none."}},"required":["chain_id","curator_address","curators"],"description":"Curator details resolved by a chain-specific on-chain curator address."}},"required":["data"]},"MarketListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"minimum":0},"market_id":{"description":"Morpho Blue market id. Use <chain_id>:<market_id> for resource selectors, for example 1:0xfff1970c0ffae288764186fbb38a9171a17e98676744a1e345809cb8b9e73342.","type":"string"},"loan_token":{"type":"string"},"collateral_token":{"type":"string"},"oracle_address":{"type":"string"},"irm_address":{"type":"string"},"lltv_wad":{"description":"Liquidation LTV in WAD (1e18 = 100%).","type":"string","internalType":"bigint"},"creation_block_number":{"type":"string","internalType":"bigint"},"creation_timestamp":{"type":"integer","minimum":0}},"required":["chain_id","market_id","loan_token","collateral_token","oracle_address","irm_address","lltv_wad","creation_block_number","creation_timestamp"]}},"cursor":{"type":"string","description":"Opaque cursor. Null on the last page.","nullable":true}},"required":["data","cursor"]},"MarketLiquidityResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"market_liquidity":{"description":"Market liquidity in loan token native units.","type":"string","internalType":"bigint"},"reallocatable_liquidity":{"description":"Liquidity available through Public Allocator V2 in loan token native units.","type":"string","internalType":"bigint"},"borrow_amount_to_target_utilization":{"description":"Additional borrow capacity to target utilization, including Public Allocator V2 reallocations, in loan token native units.","type":"string","internalType":"bigint"},"last_indexed_block":{"description":"Indexer tip block number when serving the response.","type":"string","internalType":"bigint"}},"description":"Morpho Blue market and Public Allocator V2 liquidity.","required":["market_liquidity","reallocatable_liquidity","borrow_amount_to_target_utilization","last_indexed_block"]}},"required":["data"]},"MarketPublicAllocatorVaultsResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"vault_address":{"description":"Vault V2 contract address.","type":"string"},"adapter_address":{"description":"Adapter contract address.","type":"string"},"cap_id":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Adapter-qualified market cap identifier (bytes32) from the vault's Public Allocator V2 config for this adapter."},"absolute_cap":{"description":"Absolute cap from the vault's Public Allocator V2 market config for this adapter, in loan-token native units. Not the vault's own Vault V2 cap.","type":"string","internalType":"bigint"},"can_pull_from_market":{"type":"boolean","description":"Whether the Public Allocator V2 can pull assets from this market."},"can_pull_from_idle":{"type":"boolean","description":"Whether the Public Allocator V2 can pull idle assets from this vault."},"penalty_wad":{"description":"Public Allocator V2 penalty, WAD-scaled (1e18 = 100%).","type":"string","internalType":"bigint"},"public_allocator_address":{"description":"Public Allocator V2 contract address.","type":"string"}},"required":["vault_address","adapter_address","cap_id","can_pull_from_market","can_pull_from_idle","public_allocator_address","absolute_cap","penalty_wad"]},"description":"Candidate vault and adapter rows. Order is unspecified."},"last_indexed_block":{"description":"Indexer tip block number when serving the response.","type":"string","internalType":"bigint"}},"required":["data","last_indexed_block"]},"MarketRootResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"minimum":0},"market_id":{"type":"string"},"loan_token":{"type":"string"},"collateral_token":{"type":"string"},"oracle_address":{"type":"string"},"irm_address":{"type":"string"},"lltv_wad":{"description":"Liquidation LTV in WAD (1e18 = 100%).","type":"string","internalType":"bigint"},"creation_block_number":{"type":"string","internalType":"bigint"}},"required":["chain_id","market_id","loan_token","collateral_token","oracle_address","irm_address","lltv_wad","creation_block_number"]}},"required":["data"]},"MarketStateResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"market_id":{"description":"Morpho Blue market id (bytes32 unique key).","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this market state.","type":"string","internalType":"bigint"},"last_accrual_timestamp":{"type":"integer","minimum":0,"description":"Latest accrual timestamp, in Unix seconds."},"total_supply_assets":{"description":"Total supplied assets in loan token units.","type":"string","internalType":"bigint"},"total_supply_shares":{"description":"Total supply shares.","type":"string","internalType":"bigint"},"total_borrow_assets":{"description":"Total borrowed assets in loan token units.","type":"string","internalType":"bigint"},"total_borrow_shares":{"description":"Total borrow shares.","type":"string","internalType":"bigint"},"fee_wad":{"description":"Protocol fee scaled by WAD (1e18).","type":"string","internalType":"bigint"},"rate_at_target_per_second_wad":{"type":"string","internalType":"bigint","description":"AdaptiveCurveIRM borrow rate per second at target utilization (90%), scaled by WAD (1e18). It describes the market at the same moment as the totals in this response: on indexed responses both are accrued forward from `last_accrual_timestamp` (Midx to the request time, realtime to its indexed block), and on the RPC fallback both are the values stored on-chain at `last_accrual_timestamp`. Null when the market's IRM is not the chain's AdaptiveCurveIRM (including markets with no IRM) or no rate at target is stored for the market.","nullable":true}},"required":["chain_id","market_id","last_indexed_block","last_accrual_timestamp","total_supply_assets","total_supply_shares","total_borrow_assets","total_borrow_shares","fee_wad","rate_at_target_per_second_wad"],"description":"Morpho Blue market live state."}},"required":["data"]},"MarketStateHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the market selector."},"market_id":{"description":"Morpho Blue market id from the market selector.","type":"string"}},"required":["chain_id","market_id"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Snapshot timestamp in Unix seconds."},"total_supply_assets":{"description":"Total supplied assets in loan token units.","type":"string","internalType":"bigint"},"total_supply_shares":{"description":"Total supply shares.","type":"string","internalType":"bigint"},"total_borrow_assets":{"description":"Total borrowed assets in loan token units.","type":"string","internalType":"bigint"},"total_borrow_shares":{"description":"Total borrow shares.","type":"string","internalType":"bigint"},"total_collateral_assets":{"type":"string","internalType":"bigint","description":"Total collateral in raw collateral-token asset units (not decimal-adjusted). Null when unavailable from the source, including markets without a collateral token (zero address).","nullable":true}},"required":["timestamp","total_supply_assets","total_supply_shares","total_borrow_assets","total_borrow_shares","total_collateral_assets"]},"description":"Morpho Blue market historical state points. Missing snapshots are omitted from the series; available snapshots with null collateral totals are retained."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical state.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"MarketApyAveragesResponseDto":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"market_id":{"description":"Morpho Blue market id (bytes32 unique key).","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute these APY averages.","type":"string","internalType":"bigint"},"supply_apy_averages":{"type":"object","properties":{"6h":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true},"24h":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true},"7d":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true},"30d":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true},"90d":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true},"1y":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true}},"required":["6h","24h","7d","30d","90d","1y"],"description":"Average supply APYs excluding rewards."},"borrow_apy_averages":{"type":"object","properties":{"6h":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true},"24h":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true},"7d":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true},"30d":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true},"90d":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true},"1y":{"type":"number","description":"Average APY as a decimal rate. Null when historical snapshots are not available for the full window.","nullable":true}},"required":["6h","24h","7d","30d","90d","1y"],"description":"Average borrow APYs excluding rewards."}},"required":["chain_id","market_id","supply_apy_averages","borrow_apy_averages","last_indexed_block"],"description":"Morpho Blue market APY averages."}},"required":["data"]},"MarketApyHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the market selector."},"market_id":{"description":"Morpho Blue market id from the market selector.","type":"string"}},"required":["chain_id","market_id"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Historical sample timestamp in Unix seconds."},"supply_apy":{"type":"number","description":"Historical supply APY.","nullable":true},"borrow_apy":{"type":"number","description":"Historical borrow APY.","nullable":true}},"required":["timestamp","supply_apy","borrow_apy"]},"description":"Morpho Blue market historical APY points."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical APY.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"OracleStateResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"last_updated_at":{"type":"string","internalType":"bigint","description":"Unix timestamp (seconds) at which the oracle price was last updated onchain.","nullable":true},"oracle_address":{"description":"Oracle contract address.","type":"string"},"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"last_indexed_block":{"description":"Latest indexed block used to compute this oracle state.","type":"string","internalType":"bigint"},"price":{"type":"string","internalType":"bigint","description":"Oracle quote, null when the latest quote is unavailable.","nullable":true}},"required":["oracle_address","chain_id"],"description":"Oracle live state."}},"required":["data"]},"TokenRootResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"address":{"description":"ERC-20 token contract address.","type":"string"},"name":{"type":"string","description":"ERC-20 token name. May be overridden by the Morpho team.","nullable":true},"symbol":{"type":"string","description":"ERC-20 token symbol. May be overridden by the Morpho team.","nullable":true},"decimals":{"type":"integer","minimum":0,"maximum":255,"description":"ERC-20 token decimals."},"logo_uri":{"type":"string","description":"Token logo URI.","nullable":true},"tags":{"type":"array","items":{"type":"string"},"description":"Curated asset tags.","nullable":true}},"required":["chain_id","address","name","symbol","decimals","logo_uri","tags"],"description":"ERC-20 token identity and metadata."}},"required":["data"]},"TokenPriceResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"address":{"description":"ERC-20 token contract address.","type":"string"},"price":{"type":"number","description":"Spot price in USD. Null when the API cannot currently price the known token.","nullable":true},"timestamp":{"type":"string","internalType":"bigint","description":"Unix timestamp (seconds) of the price point. Null when no price point is available.","nullable":true},"provider":{"type":"string","description":"Upstream price data provider. Null when no price point is available.","nullable":true}},"required":["chain_id","address","price","provider"],"description":"Token spot price in USD. Nullable price fields indicate that the known token cannot currently be priced."}},"required":["data"]},"UserMarketPositionResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"market_id":{"description":"Morpho Blue market identifier.","type":"string"},"user_address":{"description":"Position owner address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this position.","type":"string","internalType":"bigint"},"collateral_assets":{"description":"Collateral amount deposited, in collateral token units.","type":"string","internalType":"bigint"},"supply_shares":{"description":"Supply shares held, denominated in loan token shares.","type":"string","internalType":"bigint"},"borrow_shares":{"description":"Borrow shares owed, denominated in loan token shares.","type":"string","internalType":"bigint"}},"required":["chain_id","market_id","user_address","last_indexed_block","collateral_assets","supply_shares","borrow_shares"],"description":"User's live Morpho Blue market position."}},"required":["data"]},"UserMarketPositionsResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"user_address":{"description":"Position owner address.","type":"string"}},"required":["user_address"]},"data":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"market_id":{"description":"Morpho Blue market identifier.","type":"string"},"supply_shares":{"description":"Supply shares held, denominated in loan token shares.","type":"string","internalType":"bigint"},"borrow_shares":{"description":"Borrow shares owed, denominated in loan token shares.","type":"string","internalType":"bigint"},"collateral_assets":{"description":"Collateral deposited, in collateral token units.","type":"string","internalType":"bigint"}},"required":["chain_id","market_id","supply_shares","borrow_shares","collateral_assets"]},"description":"User Morpho Blue market positions."},"cursor":{"type":"string","description":"Opaque cursor. Null on the last page.","nullable":true}},"required":["params","data","cursor"]},"UserMarketPositionHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the market selector."},"market_id":{"description":"Morpho Blue market id from the market selector.","type":"string"},"user_address":{"description":"Position owner address from the user address parameter.","type":"string"}},"required":["chain_id","market_id","user_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Historical sample timestamp in Unix seconds."},"collateral_assets":{"description":"Collateral amount deposited, in collateral token units.","type":"string","internalType":"bigint"},"supply_shares":{"description":"Supply shares held, denominated in loan token shares.","type":"string","internalType":"bigint"},"borrow_shares":{"description":"Borrow shares owed, denominated in loan token shares.","type":"string","internalType":"bigint"}},"required":["timestamp","collateral_assets","supply_shares","borrow_shares"]},"description":"User's Morpho Blue market historical position points."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical position.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"UserMarketPositionPerformanceResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"market_id":{"description":"Morpho Blue market identifier.","type":"string"},"user_address":{"description":"Position owner address.","type":"string"},"last_indexed_block":{"description":"Minimum of the market-state and position-performance sync blocks.","type":"string","internalType":"bigint"},"accounting_method":{"type":"string","enum":["average_cost"]},"supply_net_earnings_assets":{"description":"Signed realized and unrealized supply earnings in loan-token units.","type":"string","internalType":"bigint"},"supply_return_on_capital":{"type":"number","nullable":true},"borrow_net_cost_assets":{"description":"Signed realized and unrealized borrow cost in loan-token units; positive means cost.","type":"string","internalType":"bigint"},"borrow_cost_on_capital":{"type":"number","nullable":true}},"required":["chain_id","market_id","user_address","accounting_method","supply_return_on_capital","borrow_cost_on_capital"]}},"required":["data"]},"UserVaultV1PositionResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"user_address":{"description":"Position owner address.","type":"string"},"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this position.","type":"string","internalType":"bigint"},"shares":{"description":"Amount of vault shares.","type":"string","internalType":"bigint"},"assets":{"description":"Value of vault shares held, in underlying token units.","type":"string","internalType":"bigint"}},"required":["user_address","chain_id","vault_address"],"description":"User's live Vault V1 position."}},"required":["data"]},"UserVaultPositionsResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"user_address":{"description":"Position owner address.","type":"string"}},"required":["user_address"]},"data":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"last_indexed_block":{"type":"string","internalType":"bigint","description":"Indexer freshness tip for this chain, or the row source block when the tip is unavailable. Null only when neither exists. This is not a snapshot boundary for pagination.","nullable":true},"vault_address":{"description":"Vault contract address.","type":"string"},"shares":{"description":"Amount of vault shares.","type":"string","internalType":"bigint"},"assets":{"description":"Value of vault shares held, in underlying token units. Computed from the sampled share price and rounded down.","type":"string","internalType":"bigint"}},"required":["chain_id","vault_address","last_indexed_block","shares","assets"]},"description":"User vault positions."},"cursor":{"type":"string","description":"Opaque seek cursor for a weakly consistent continuation page. Null on the last page. Do not parse or modify it.","nullable":true}},"required":["params","data","cursor"]},"UserVaultV1PositionActivityResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier from the vault selector.","minimum":0},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"},"user_address":{"description":"Position owner address from the user address parameter.","type":"string"}},"required":["chain_id","vault_address","user_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"block_number":{"description":"Block in which the event occurred.","type":"string","internalType":"bigint"},"tx_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Hash of the transaction that emitted the event."},"log_index":{"type":"integer","minimum":0,"description":"Index of the event log within the transaction."},"timestamp":{"type":"integer","minimum":0,"description":"Block timestamp in Unix seconds."},"type":{"type":"string","enum":["deposit"]},"data":{"type":"object","properties":{"shares":{"description":"Magnitude of the share balance change. Never negative; direction comes from the event type.","type":"string","internalType":"bigint"},"assets":{"description":"Deposited assets in underlying token units, taken from the log.","type":"string","internalType":"bigint"},"sender":{"description":"Address that called deposit or mint and supplied the assets (the Deposit event's sender). May differ from the requested user, for example a bundler or router.","type":"string"},"on_behalf":{"description":"Address credited with the minted shares (the Deposit event's owner). Always the requested user on this endpoint.","type":"string"}},"required":["sender","on_behalf","shares","assets"]}},"required":["tx_hash","log_index","timestamp","type","data","block_number"]},{"type":"object","properties":{"block_number":{"description":"Block in which the event occurred.","type":"string","internalType":"bigint"},"tx_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Hash of the transaction that emitted the event."},"log_index":{"type":"integer","minimum":0,"description":"Index of the event log within the transaction."},"timestamp":{"type":"integer","minimum":0,"description":"Block timestamp in Unix seconds."},"type":{"type":"string","enum":["withdraw"]},"data":{"type":"object","properties":{"shares":{"description":"Magnitude of the share balance change. Never negative; direction comes from the event type.","type":"string","internalType":"bigint"},"assets":{"description":"Withdrawn assets in underlying token units, taken from the log.","type":"string","internalType":"bigint"},"sender":{"description":"Address that called withdraw or redeem (the Withdraw event's sender). May differ from the requested user when an approved spender or bundler acts for them.","type":"string"},"receiver":{"description":"Address that received the withdrawn assets (the Withdraw event's receiver). May differ from the requested user.","type":"string"},"on_behalf":{"description":"Address whose shares were burned (the Withdraw event's owner). Always the requested user on this endpoint.","type":"string"}},"required":["sender","receiver","on_behalf","shares","assets"]}},"required":["tx_hash","log_index","timestamp","type","data","block_number"]},{"type":"object","properties":{"block_number":{"description":"Block in which the event occurred.","type":"string","internalType":"bigint"},"tx_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Hash of the transaction that emitted the event."},"log_index":{"type":"integer","minimum":0,"description":"Index of the event log within the transaction."},"timestamp":{"type":"integer","minimum":0,"description":"Block timestamp in Unix seconds."},"type":{"type":"string","enum":["shares_transfer_in"]},"data":{"type":"object","properties":{"shares":{"description":"Magnitude of the share balance change. Never negative; direction comes from the event type.","type":"string","internalType":"bigint"},"from_address":{"description":"Sender of the shares.","type":"string"}},"required":["from_address","shares"]}},"required":["tx_hash","log_index","timestamp","type","data","block_number"]},{"type":"object","properties":{"block_number":{"description":"Block in which the event occurred.","type":"string","internalType":"bigint"},"tx_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Hash of the transaction that emitted the event."},"log_index":{"type":"integer","minimum":0,"description":"Index of the event log within the transaction."},"timestamp":{"type":"integer","minimum":0,"description":"Block timestamp in Unix seconds."},"type":{"type":"string","enum":["shares_transfer_out"]},"data":{"type":"object","properties":{"shares":{"description":"Magnitude of the share balance change. Never negative; direction comes from the event type.","type":"string","internalType":"bigint"},"to_address":{"description":"Recipient of the shares.","type":"string"}},"required":["to_address","shares"]}},"required":["tx_hash","log_index","timestamp","type","data","block_number"]}]},"description":"Share balance events, ordered by block number then log index, most recent first."},"cursor":{"type":"string","description":"Opaque pagination cursor. Null on the last page.","nullable":true},"last_indexed_block":{"description":"Latest indexed block covered by this page. Pinned to the first page's indexer tip for every continuation page, so a complete walk to a null cursor reconciles against a single watermark.","type":"string","internalType":"bigint"}},"required":["params","data","cursor","last_indexed_block"]},"UserVaultV1PositionHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the vault selector."},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"},"user_address":{"description":"Position owner address from the user address parameter.","type":"string"}},"required":["chain_id","vault_address","user_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Historical sample timestamp in Unix seconds."},"shares":{"description":"Amount of vault shares held.","type":"string","internalType":"bigint"},"assets":{"description":"Value of vault shares held, in underlying token units.","type":"string","internalType":"bigint"}},"required":["timestamp","shares","assets"]},"description":"User's Vault V1 historical position points."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical position.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"UserVaultV1PositionPerformanceResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"user_address":{"description":"Position owner address.","type":"string"},"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this performance snapshot.","type":"string","internalType":"bigint"},"accounting_method":{"type":"string","description":"Accounting method used to compute net earnings and return on capital.","enum":["average_cost"]},"net_earnings_assets":{"description":"Realized + unrealized earnings of the position, in underlying token units; measured up to the cutoff when `as_of_date` is set.","type":"string","internalType":"bigint"},"return_on_capital":{"type":"number","description":"Time-weighted return of the position over its holding period, non-annualized; measured up to the cutoff when `as_of_date` is set.","nullable":true},"as_of":{"description":"Present only when `as_of_date` is set. Historical valuation through the UTC start-of-day cutoff of `as_of_date`. For an open position, valuation uses the last hourly share-price history point or the user's last position change, whichever is later, at or before the cutoff; it is not block-exact, and the gap between the cutoff and `timestamp` indicates the age of the valuation point. For a position fully exited before the cutoff, `timestamp` is its last position change and the value is final, so that gap does not indicate staleness.","type":"object","properties":{"timestamp":{"type":"integer","description":"Effective valuation timestamp (Unix seconds) used for the historical result; null only when the user had no position before the cutoff and the vault has no share-price history at or before it.","nullable":true}},"required":["timestamp"]}},"required":["user_address","chain_id","vault_address","accounting_method","return_on_capital"],"description":"User's Vault V1 position performance."}},"required":["data"]},"UserVaultV2PositionResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"user_address":{"description":"Position owner address.","type":"string"},"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this position.","type":"string","internalType":"bigint"},"shares":{"description":"Amount of vault shares.","type":"string","internalType":"bigint"},"assets":{"description":"Value of vault shares held, in underlying token units.","type":"string","internalType":"bigint"}},"required":["user_address","chain_id","vault_address"],"description":"User's live Vault V2 position."}},"required":["data"]},"UserVaultV2PositionHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the vault selector."},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"},"user_address":{"description":"Position owner address from the user address parameter.","type":"string"}},"required":["chain_id","vault_address","user_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Historical sample timestamp in Unix seconds."},"shares":{"description":"Amount of vault shares held.","type":"string","internalType":"bigint"},"assets":{"description":"Value of vault shares held, in underlying token units.","type":"string","internalType":"bigint"}},"required":["timestamp","shares","assets"]},"description":"User's Vault V2 historical position points."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical position.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"UserVaultV2PositionActivityResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier from the vault selector.","minimum":0},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"},"user_address":{"description":"Position owner address from the user address parameter.","type":"string"}},"required":["chain_id","vault_address","user_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","enum":["deposit"]},"data":{"type":"object","properties":{"shares":{"description":"Vault shares minted to the user.","type":"string","internalType":"bigint"},"assets":{"description":"Assets deposited, in underlying token units.","type":"string","internalType":"bigint"}},"required":["shares","assets"]},"block_number":{"description":"Block that contains the event log.","type":"string","internalType":"bigint"},"tx_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Hash of the transaction that emitted the event log."},"log_index":{"type":"integer","minimum":0,"description":"Index of the event log within its block."},"timestamp":{"type":"integer","minimum":0,"description":"Block timestamp in Unix seconds."}},"required":["type","data","tx_hash","log_index","timestamp","block_number"]},{"type":"object","properties":{"type":{"type":"string","enum":["withdraw"]},"data":{"type":"object","properties":{"shares":{"description":"Vault shares burned from the user.","type":"string","internalType":"bigint"},"assets":{"description":"Assets withdrawn, in underlying token units.","type":"string","internalType":"bigint"}},"required":["shares","assets"]},"block_number":{"description":"Block that contains the event log.","type":"string","internalType":"bigint"},"tx_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Hash of the transaction that emitted the event log."},"log_index":{"type":"integer","minimum":0,"description":"Index of the event log within its block."},"timestamp":{"type":"integer","minimum":0,"description":"Block timestamp in Unix seconds."}},"required":["type","data","tx_hash","log_index","timestamp","block_number"]},{"type":"object","properties":{"type":{"type":"string","enum":["shares_transfer_in"]},"data":{"type":"object","properties":{"shares":{"description":"Vault shares received by the user.","type":"string","internalType":"bigint"},"from_address":{"description":"Address the vault shares were sent from.","type":"string"}},"required":["from_address","shares"]},"block_number":{"description":"Block that contains the event log.","type":"string","internalType":"bigint"},"tx_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Hash of the transaction that emitted the event log."},"log_index":{"type":"integer","minimum":0,"description":"Index of the event log within its block."},"timestamp":{"type":"integer","minimum":0,"description":"Block timestamp in Unix seconds."}},"required":["type","data","tx_hash","log_index","timestamp","block_number"]},{"type":"object","properties":{"type":{"type":"string","enum":["shares_transfer_out"]},"data":{"type":"object","properties":{"shares":{"description":"Vault shares sent by the user.","type":"string","internalType":"bigint"},"to_address":{"description":"Address the vault shares were sent to.","type":"string"}},"required":["to_address","shares"]},"block_number":{"description":"Block that contains the event log.","type":"string","internalType":"bigint"},"tx_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Hash of the transaction that emitted the event log."},"log_index":{"type":"integer","minimum":0,"description":"Index of the event log within its block."},"timestamp":{"type":"integer","minimum":0,"description":"Block timestamp in Unix seconds."}},"required":["type","data","tx_hash","log_index","timestamp","block_number"]}]},"description":"Events that changed the user's share balance in this Vault V2, newest first."},"cursor":{"type":"string","description":"Opaque pagination cursor. Null on the last page.","nullable":true},"last_indexed_block":{"description":"Latest indexed block used to serve this activity page.","type":"string","internalType":"bigint"}},"required":["params","data","cursor","last_indexed_block"]},"UserVaultV2PositionPerformanceResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"user_address":{"description":"Position owner address.","type":"string"},"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this performance snapshot.","type":"string","internalType":"bigint"},"accounting_method":{"type":"string","description":"Accounting method used to compute net earnings and return on capital.","enum":["average_cost"]},"net_earnings_assets":{"description":"Realized + unrealized earnings of the position, in underlying token units; measured up to the cutoff when `as_of_date` is set.","type":"string","internalType":"bigint"},"return_on_capital":{"type":"number","description":"Time-weighted return of the position over its holding period, non-annualized; measured up to the cutoff when `as_of_date` is set.","nullable":true},"as_of":{"description":"Present only when `as_of_date` is set. Historical valuation through the UTC start-of-day cutoff of `as_of_date`. For an open position, valuation uses the last hourly share-price history point or the user's last position change, whichever is later, at or before the cutoff; it is not block-exact, and the gap between the cutoff and `timestamp` indicates the age of the valuation point. For a position fully exited before the cutoff, `timestamp` is its last position change and the value is final, so that gap does not indicate staleness.","type":"object","properties":{"timestamp":{"type":"integer","description":"Effective valuation timestamp (Unix seconds) used for the historical result; null only when the user had no position before the cutoff and the vault has no share-price history at or before it.","nullable":true}},"required":["timestamp"]}},"required":["user_address","chain_id","vault_address","accounting_method","return_on_capital"],"description":"User's Vault V2 position performance."}},"required":["data"]},"VaultV1ListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault V1 contract address. The compound `{chain-id}:{vault_address}` form identifies the vault in resource URLs.","type":"string"},"version":{"type":"string","enum":["1.0","1.1"],"description":"Factory lineage of the vault contract."},"name":{"type":"string","description":"Current ERC-20 name of the vault share token."},"symbol":{"type":"string","description":"Current ERC-20 symbol of the vault share token."},"asset_address":{"description":"Underlying asset address. Join through `GET /v0/tokens/{chain-id}:{address}` for its name, symbol and decimals.","type":"string"},"factory_address":{"description":"Factory contract address that deployed the vault.","type":"string"},"creator_address":{"description":"Address that called the factory to deploy the vault (the `caller` of the factory's `CreateMetaMorpho` event).","type":"string"},"creation_block_number":{"description":"Vault creation block number.","type":"string","internalType":"bigint"},"creation_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds of the creation block."},"performance_fee_wad":{"description":"Active performance fee, WAD-scaled (1e18 = 100%). \"0\" when no fee has ever been set, which is the on-chain value.","type":"string","internalType":"bigint"},"performance_fee_recipient":{"type":"string","description":"Active performance fee recipient. Null when the vault has never set one; an explicitly-set zero address is returned verbatim.","nullable":true},"owner":{"description":"Current owner address.","type":"string"},"guardian":{"type":"string","description":"Current guardian address (guardian()), factual onchain data. Null when no guardian has been set; an explicitly-set zero address is returned verbatim.","nullable":true},"curator":{"type":"string","description":"Current curator address. Null when no curator is set.","nullable":true}},"required":["chain_id","vault_address","version","name","symbol","asset_address","factory_address","creator_address","creation_block_number","creation_timestamp","performance_fee_wad","performance_fee_recipient","owner","curator","guardian"]},"description":"Page of listed Morpho Vault V1 deployments."},"cursor":{"type":"string","description":"Opaque cursor for the next page. Null on the last page.","nullable":true}},"required":["data","cursor"]},"VaultV1RootResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"address":{"description":"Vault V1 contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this vault configuration.","type":"string","internalType":"bigint"},"version":{"type":"string","enum":["1.0","1.1"],"description":"Vault contract version (semantic)."},"name":{"type":"string","description":"ERC-20 name of the vault share token."},"symbol":{"type":"string","description":"ERC-20 symbol of the vault share token."},"asset":{"type":"object","properties":{"address":{"description":"ERC-20 token contract address.","type":"string"},"decimals":{"type":"integer","minimum":0,"maximum":255,"description":"ERC-20 token decimals.","nullable":true},"name":{"type":"string","description":"ERC-20 token name.","nullable":true},"symbol":{"type":"string","description":"ERC-20 token symbol.","nullable":true}},"required":["address","decimals","name","symbol"],"description":"Underlying asset metadata."},"factory_address":{"description":"Factory contract address that deployed the vault.","type":"string"},"creator_address":{"type":"string","description":"Address that called the factory to deploy the vault (the `caller` of the factory's `CreateMetaMorpho` event). Null when the response is served from the RPC fallback, which has no creation event.","nullable":true},"creation_block_number":{"description":"Vault creation block number.","type":"string","internalType":"bigint"},"fee_wad":{"type":"string","internalType":"bigint","description":"Active fee value, scaled by WAD (1e18 = 100%).","nullable":true},"fee_recipient":{"type":"string","description":"Active fee recipient address.","nullable":true},"skim_recipient":{"type":"string","description":"Active skim recipient address (reward token sweeps).","nullable":true},"owner":{"description":"Current owner address.","type":"string"},"curator":{"type":"string","description":"Current curator address.","nullable":true},"guardian":{"type":"string","description":"Current guardian address.","nullable":true},"timelock_seconds":{"type":"integer","minimum":0,"description":"Active timelock duration, in seconds."}},"required":["chain_id","address","version","name","symbol","asset","factory_address","creator_address","fee_recipient","skim_recipient","owner","curator","guardian","timelock_seconds"],"description":"Vault V1 configuration."}},"required":["data"]},"VaultRoleListResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier from the vault selector.","minimum":0},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"}},"required":["chain_id","vault_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"role_address":{"description":"Role account address.","type":"string"},"tx_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash of the latest role grant event."},"grant_block_number":{"description":"Chain block number of the latest role grant event identified by tx_hash, as a base-10 integer string. After revocation and re-grant, this is the re-grant block, not the first grant block.","type":"string","internalType":"bigint"}},"required":["role_address","tx_hash","grant_block_number"]},"description":"Complete set of active role assignments."},"last_indexed_block":{"description":"Latest indexed block used to compute this role list.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"VaultV1StateResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"address":{"description":"Vault V1 contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this vault state.","type":"string","internalType":"bigint"},"total_assets":{"description":"Total value of vault holdings, in underlying token units.","type":"string","internalType":"bigint"},"total_supply":{"description":"Vault shares total supply.","type":"string","internalType":"bigint"},"withdrawable_assets":{"description":"Assets available for immediate withdrawal from the vault.","type":"string","internalType":"bigint"},"share_price_ray":{"type":"string","internalType":"bigint","description":"Normalized share price scaled by RAY (1e27): one whole share token quoted in whole underlying tokens.","nullable":true}},"required":["chain_id","address","share_price_ray"],"description":"Vault V1 live state."}},"required":["data"]},"VaultV1StateHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the vault selector."},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"}},"required":["chain_id","vault_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Snapshot timestamp in Unix seconds."},"total_assets":{"description":"Total value of vault holdings, in underlying token units.","type":"string","internalType":"bigint"},"total_supply":{"description":"Vault shares total supply.","type":"string","internalType":"bigint"},"withdrawable_assets":{"description":"Assets available for immediate withdrawal from the vault.","type":"string","internalType":"bigint"},"share_price_ray":{"type":"string","internalType":"bigint","description":"Normalized share price scaled by RAY (1e27): one whole share token quoted in whole underlying tokens.","nullable":true}},"required":["timestamp","total_assets","total_supply","withdrawable_assets","share_price_ray"]},"description":"Vault V1 historical state points."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical state.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"VaultV1AllocationHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the vault selector."},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"}},"required":["chain_id","vault_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"market_id":{"description":"Morpho Blue market id.","type":"string"},"history":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Snapshot timestamp in Unix seconds."},"supply_assets":{"description":"Assets supplied by the vault to the market, in underlying token units.","type":"string","internalType":"bigint"},"supply_shares":{"description":"Supply shares owned by the vault in the market.","type":"string","internalType":"bigint"},"supply_cap":{"description":"Vault supply cap for the market, in underlying token units.","type":"string","internalType":"bigint"}},"required":["timestamp","supply_assets","supply_shares","supply_cap"]},"description":"Historical allocation points for this market."}},"required":["market_id","history"]},"description":"Vault V1 allocation history grouped by market."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical allocation state.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"VaultV1AllocationsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault V1 contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this allocation state.","type":"string","internalType":"bigint"},"allocations":{"type":"array","items":{"type":"object","properties":{"market_id":{"description":"Morpho Blue market id.","type":"string"},"supply_assets":{"description":"Assets supplied by the vault to the market, in underlying token units.","type":"string","internalType":"bigint"},"supply_shares":{"description":"Supply shares owned by the vault in the market.","type":"string","internalType":"bigint"},"supply_cap":{"description":"Vault supply cap for the market, in underlying token units. Stored on-chain as a uint184, so the highest possible cap is 2^184 - 1. A cap of 0 means the vault cannot supply to the market; there is no sentinel value for an uncapped market.","type":"string","internalType":"bigint"},"supply_queue_index":{"type":"integer","minimum":0,"description":"Zero-based position in the vault supply queue, or null when the market is not in the supply queue.","nullable":true},"withdraw_queue_index":{"type":"integer","minimum":0,"description":"Zero-based position in the vault withdraw queue, or null when the market is not in the withdraw queue.","nullable":true},"pending":{"type":"object","properties":{"supply_cap":{"type":"object","properties":{"value":{"description":"Submitted supply cap, in underlying token units.","type":"string","internalType":"bigint"},"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds from which the submitted supply cap can be accepted."}},"required":["valid_at_timestamp","value"],"description":"Timelocked supply cap change, or null when no cap change is pending.","nullable":true},"removal":{"type":"object","properties":{"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds from which the market can be removed from the withdraw queue."}},"required":["valid_at_timestamp"],"description":"Timelocked market removal, or null when no removal is pending.","nullable":true}},"required":["supply_cap","removal"],"description":"Timelocked allocation changes submitted for this market."}},"required":["market_id","supply_assets","supply_shares","supply_cap","supply_queue_index","withdraw_queue_index","pending"]},"description":"Every market with a current or pending relationship to the vault, ordered by ascending market id. Market details are not embedded; join through the Blue market endpoints."}},"required":["chain_id","vault_address","allocations","last_indexed_block"],"description":"Vault V1 allocation state."}},"required":["data"]},"VaultV1ApyAveragesResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this APY average.","type":"string","internalType":"bigint"},"lookback":{"type":"string","enum":["one_hour","six_hours","one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"description":"Lookback period used to compute the average APY."},"apy":{"type":"number","description":"Realized average APY of the vault, calculated from share price evolution over the lookback period.","nullable":true}},"required":["chain_id","vault_address","lookback","apy"],"description":"Vault V1 realized average APY."}},"required":["data"]},"VaultV1ApyHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the vault selector."},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"}},"required":["chain_id","vault_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Historical sample timestamp in Unix seconds."},"apy":{"type":"number","description":"Historical vault APY.","nullable":true}},"required":["timestamp","apy"]},"description":"Vault V1 historical APY points."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical APY.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"VaultV1PendingGovernanceActionsResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"number","enum":[1,8453,747474,999,42161,137,130,10,480,143,988,4217,4663,5042,196],"description":"EVM chain identifier."},"vault_address":{"description":"Vault contract address.","type":"string"}},"required":["chain_id","vault_address"]},"data":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"action_type":{"type":"string","enum":["set_cap"]},"parameters":{"type":"object","properties":{"market_id":{"description":"Morpho Blue market id.","type":"string"},"new_supply_cap":{"description":"Pending supply cap in underlying token units.","type":"string","internalType":"bigint"}},"required":["market_id","new_supply_cap"]},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."}},"required":["submitted_transaction_hash","action_type","parameters","executable_at_timestamp"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"action_type":{"type":"string","enum":["set_timelock"]},"parameters":{"type":"object","properties":{"new_timelock_seconds":{"type":"integer","minimum":0,"description":"Pending timelock duration, in seconds."}},"required":["new_timelock_seconds"]},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."}},"required":["submitted_transaction_hash","action_type","parameters","executable_at_timestamp"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"action_type":{"type":"string","enum":["set_guardian"]},"parameters":{"type":"object","properties":{"new_guardian":{"description":"Pending guardian address.","type":"string"}},"required":["new_guardian"]},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."}},"required":["submitted_transaction_hash","action_type","parameters","executable_at_timestamp"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"action_type":{"type":"string","enum":["remove_market"]},"parameters":{"type":"object","properties":{"market_id":{"description":"Morpho Blue market id.","type":"string"}},"required":["market_id"]},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."}},"required":["submitted_transaction_hash","action_type","parameters","executable_at_timestamp"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"action_type":{"type":"string","enum":["transfer_ownership"]},"parameters":{"type":"object","properties":{"pending_owner":{"description":"Pending owner address.","type":"string"}},"required":["pending_owner"]},"executable_at_timestamp":{"type":"null","description":"Ownable2Step ownership transfers are not timelocked."}},"required":["submitted_transaction_hash","action_type","parameters","executable_at_timestamp"]}]},"description":"Pending governance actions for this Vault V1."},"cursor":{"type":"string","description":"Opaque pagination cursor.","nullable":true},"last_indexed_block":{"description":"Latest indexed block used to compute this pending action list.","type":"string","internalType":"bigint"}},"required":["params","data","cursor","last_indexed_block"]},"VaultV2ListResponse":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault V2 contract address, EIP-55 checksummed. Use <chain_id>:<vault_address> as the resource selector in per-vault routes, for example 1:0x23f5E9c35820f4baB695Ac1F19c203cC3f8e1e11.","type":"string"},"version":{"type":"string","description":"Vault contract version."},"name":{"type":"string","description":"ERC-20 name of the vault share token.","nullable":true},"symbol":{"type":"string","description":"ERC-20 symbol of the vault share token.","nullable":true},"asset_address":{"description":"Underlying asset address, EIP-55 checksummed. Resolve its name, symbol and decimals via the token endpoint.","type":"string"},"factory_address":{"description":"Factory contract address that deployed the vault, EIP-55 checksummed.","type":"string"},"creation_block_number":{"description":"Vault creation block number.","type":"string","internalType":"bigint"},"creation_timestamp":{"type":"integer","minimum":0,"description":"Unix timestamp of the creation block, in seconds."},"management_fee_wad":{"type":"string","internalType":"bigint","description":"Active management fee, scaled by WAD (1e18 = 100%). Null when never set. Sorting treats null as 0, so unset fees sort lowest.","nullable":true},"management_fee_recipient":{"type":"string","description":"Active management fee recipient. Null while no fee is charged. A zero address on-chain is also returned as `null`.","nullable":true},"performance_fee_wad":{"type":"string","internalType":"bigint","description":"Active performance fee, scaled by WAD (1e18 = 100%). Null when never set. Sorting treats null as 0, so unset fees sort lowest.","nullable":true},"performance_fee_recipient":{"type":"string","description":"Active performance fee recipient. Null while no fee is charged. A zero address on-chain is also returned as `null`.","nullable":true},"owner":{"type":"string","description":"Current owner address. A zero address on-chain is returned as `null`.","nullable":true},"curator":{"type":"string","description":"Current curator address. A zero address on-chain is returned as `null`.","nullable":true}},"required":["chain_id","vault_address","version","name","symbol","asset_address","factory_address","creation_timestamp","management_fee_recipient","performance_fee_recipient","owner","curator","creation_block_number","management_fee_wad","performance_fee_wad"]},"description":"Listed Morpho Vault V2 instances."},"cursor":{"type":"string","description":"Opaque cursor. Null on the last page.","nullable":true}},"required":["data","cursor"]},"VaultV2RootResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"address":{"description":"Vault V2 contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this vault configuration.","type":"string","internalType":"bigint"},"version":{"type":"string","description":"Vault contract version."},"name":{"type":"string","description":"ERC-20 name of the vault share token.","nullable":true},"symbol":{"type":"string","description":"ERC-20 symbol of the vault share token.","nullable":true},"asset":{"type":"object","properties":{"address":{"description":"ERC-20 token contract address.","type":"string"},"decimals":{"type":"integer","minimum":0,"maximum":255,"description":"ERC-20 token decimals.","nullable":true},"name":{"type":"string","description":"ERC-20 token name.","nullable":true},"symbol":{"type":"string","description":"ERC-20 token symbol.","nullable":true}},"required":["address","decimals","name","symbol"],"description":"Underlying asset metadata."},"decimals_offset":{"type":"integer","minimum":0,"maximum":18,"description":"Decimals offset applied to vault share accounting.","nullable":true},"factory_address":{"description":"Factory contract address that deployed the vault.","type":"string"},"creation_block_number":{"description":"Vault creation block number.","type":"string","internalType":"bigint"},"owner":{"type":"string","description":"Current owner address. A zero address on-chain is returned as `null`.","nullable":true},"curator":{"type":"string","description":"Current curator address. A zero address on-chain is returned as `null`.","nullable":true},"governance":{"type":"object","properties":{"timelocks":{"type":"array","items":{"type":"object","properties":{"function_name":{"type":"string","enum":["setIsAllocator","setReceiveSharesGate","setSendSharesGate","setReceiveAssetsGate","setSendAssetsGate","setAdapterRegistry","addAdapter","removeAdapter","increaseTimelock","decreaseTimelock","setPerformanceFee","setManagementFee","setPerformanceFeeRecipient","setManagementFeeRecipient","increaseAbsoluteCap","increaseRelativeCap","setForceDeallocatePenalty","abdicate"],"description":"Solidity function name, matching GraphQL timelocks.functionName. Includes every supported timelocked function in canonical order."},"timelock_seconds":{"description":"Current timelock mapping value in seconds, as an exact base-10 uint256 string, including unbounded values. Zero when never set. Preserved after abdication; decreaseTimelock is scheduled using the target function's timelock at submission.","type":"string","internalType":"bigint"},"is_abdicated":{"type":"boolean","description":"Whether the function has been permanently abdicated, based on the indexed Abdicate event. An abdicated function can never be called again."},"abdicated_at_timestamp":{"type":"integer","minimum":0,"description":"Unix timestamp in seconds when this specific function was abdicated, from its indexed Abdicate event. Null when the function has not been abdicated.","nullable":true}},"required":["function_name","is_abdicated","abdicated_at_timestamp","timelock_seconds"]},"description":"One entry for each of the 18 supported timelocked functions, including functions whose timelock has never been set."}},"required":["timelocks"],"description":"Indexed per-function governance configuration from the same sources as GraphQL timelocks. Null on RPC fallback, which does not load per-function timelocks or abdication state.","nullable":true},"timelock_seconds":{"type":"integer","minimum":0,"description":"Maximum active timelock duration across timelocked functions, in seconds. Unbounded timelocks (e.g. set to make them irrevocable) are clamped to the maximum safe integer.","nullable":true},"management_fee_wad":{"type":"string","internalType":"bigint","description":"Active management fee value, scaled by WAD (1e18 = 100%).","nullable":true},"management_fee_recipient":{"type":"string","description":"Active management fee recipient address. A zero address on-chain is returned as `null`.","nullable":true},"performance_fee_wad":{"type":"string","internalType":"bigint","description":"Active performance fee value, scaled by WAD (1e18 = 100%).","nullable":true},"performance_fee_recipient":{"type":"string","description":"Active performance fee recipient address. A zero address on-chain is returned as `null`.","nullable":true},"max_rate_per_second_wad":{"type":"string","internalType":"bigint","description":"Maximum rate per second, scaled by WAD (1e18 = 100%).","nullable":true},"adapter_registry":{"type":"string","description":"Active adapter registry address. A zero address on-chain is returned as `null`.","nullable":true},"liquidity_adapter":{"type":"string","description":"Active liquidity adapter address. A zero address on-chain is returned as `null`.","nullable":true},"liquidity_data":{"type":"string","description":"Active liquidity adapter calldata.","nullable":true},"gates":{"type":"object","properties":{"send_shares":{"type":"string","description":"Gate for sending shares (transfer from vault); `null` when no gate is set, including a gate reset to the zero address.","nullable":true},"receive_shares":{"type":"string","description":"Gate for receiving shares (transfer to vault); `null` when no gate is set, including a gate reset to the zero address.","nullable":true},"send_assets":{"type":"string","description":"Gate for sending assets (withdraw); `null` when no gate is set, including a gate reset to the zero address.","nullable":true},"receive_assets":{"type":"string","description":"Gate for receiving assets (deposit); `null` when no gate is set, including a gate reset to the zero address.","nullable":true}},"required":["send_shares","receive_shares","send_assets","receive_assets"],"description":"Gates controlling access to Vault V2 operations."}},"required":["chain_id","address","version","name","symbol","asset","decimals_offset","factory_address","owner","curator","governance","timelock_seconds","management_fee_recipient","performance_fee_recipient","adapter_registry","liquidity_adapter","liquidity_data","gates"],"description":"Vault V2 configuration."}},"required":["data"]},"VaultV2StateResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"address":{"description":"Vault V2 contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this vault state.","type":"string","internalType":"bigint"},"last_accrual_timestamp":{"type":"integer","minimum":0,"description":"Latest accrual timestamp, in Unix seconds."},"total_assets":{"description":"Total value of vault holdings, in underlying token units.","type":"string","internalType":"bigint"},"total_supply":{"description":"Vault shares total supply.","type":"string","internalType":"bigint"},"withdrawable_assets":{"description":"Liquidity available from the liquidity adapter plus idle assets.","type":"string","internalType":"bigint"},"allocated_assets":{"description":"Real assets allocated in the vault, excluding virtual accrual.","type":"string","internalType":"bigint"},"idle_assets":{"description":"Assets deposited to the vault that are not generating interest.","type":"string","internalType":"bigint"},"share_price_ray":{"type":"string","internalType":"bigint","description":"Normalized share price scaled by RAY (1e27): one whole share token quoted in whole underlying tokens.","nullable":true}},"required":["chain_id","address","last_accrual_timestamp","share_price_ray"],"description":"Vault V2 live state."}},"required":["data"]},"VaultV2StateHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the vault selector."},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"}},"required":["chain_id","vault_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Snapshot timestamp in Unix seconds."},"total_assets":{"description":"Total value of vault holdings, in underlying token units.","type":"string","internalType":"bigint"},"total_supply":{"description":"Vault shares total supply.","type":"string","internalType":"bigint"},"withdrawable_assets":{"description":"Liquidity available from the liquidity adapter plus idle assets.","type":"string","internalType":"bigint"},"allocated_assets":{"description":"Real assets allocated in the vault, excluding virtual accrual.","type":"string","internalType":"bigint"},"idle_assets":{"description":"Assets deposited to the vault that are not generating interest.","type":"string","internalType":"bigint"},"share_price_ray":{"type":"string","internalType":"bigint","description":"Normalized share price scaled by RAY (1e27): one whole share token quoted in whole underlying tokens.","nullable":true}},"required":["timestamp","total_assets","total_supply","withdrawable_assets","allocated_assets","idle_assets","share_price_ray"]},"description":"Vault V2 historical state points."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical state.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"VaultV2CapsHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the vault selector."},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"}},"required":["chain_id","vault_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"cap_id":{"description":"Vault V2 cap id.","type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"history":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Snapshot timestamp in Unix seconds."},"allocation":{"description":"Assets allocated to this cap target, in underlying token units.","type":"string","internalType":"bigint"},"absolute_cap":{"description":"Absolute allocation cap, in underlying token units.","type":"string","internalType":"bigint"},"relative_cap_wad":{"description":"Relative allocation cap scaled by WAD (1e18).","type":"string","internalType":"bigint"},"relative_allocation":{"type":"number","minimum":0,"description":"Allocation relative to vault total assets as a ratio."}},"required":["timestamp","allocation","absolute_cap","relative_cap_wad","relative_allocation"]},"description":"Historical allocation and cap points for this cap."},"cap_type":{"type":"string","description":"Cap tracked against the adapter as a whole, covering every position it holds.","enum":["adapter"]},"adapter_address":{"description":"Adapter contract address this cap constrains.","type":"string"},"target":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","description":"Adapter supplying to Morpho Blue markets. A single adapter can serve several markets, so the markets themselves are listed per cap.","enum":["blue_market"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","description":"Adapter depositing into a Morpho Vault V1.","enum":["vault_v1"]},"vault_address":{"description":"Address of the Morpho Vault V1 the adapter deposits into.","type":"string"}},"required":["type","vault_address"]},{"type":"object","properties":{"type":{"type":"string","description":"Adapter depositing into a nested Morpho Vault V2.","enum":["vault_v2"]},"vault_address":{"description":"Address of the nested Morpho Vault V2 the adapter deposits into.","type":"string"}},"required":["type","vault_address"]},{"type":"object","properties":{"type":{"type":"string","description":"Adapter that was not deployed by a known Morpho factory, or whose target is neither a Vault V1 nor a Vault V2.","enum":["unknown"]},"target_address":{"type":"string","description":"On-chain target pointer when one is recorded, for diagnostics. Null when the adapter exposes no target.","nullable":true}},"required":["type","target_address"]}],"description":"Where this adapter routes the assets it receives, in the /allocations shape. Resolved from the adapter factory's creation event, so it is also set for adapters removed from the vault."}},"required":["cap_id","history","cap_type","adapter_address","target"]},{"type":"object","properties":{"cap_id":{"description":"Vault V2 cap id.","type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"history":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Snapshot timestamp in Unix seconds."},"allocation":{"description":"Assets allocated to this cap target, in underlying token units.","type":"string","internalType":"bigint"},"absolute_cap":{"description":"Absolute allocation cap, in underlying token units.","type":"string","internalType":"bigint"},"relative_cap_wad":{"description":"Relative allocation cap scaled by WAD (1e18).","type":"string","internalType":"bigint"},"relative_allocation":{"type":"number","minimum":0,"description":"Allocation relative to vault total assets as a ratio."}},"required":["timestamp","allocation","absolute_cap","relative_cap_wad","relative_allocation"]},"description":"Historical allocation and cap points for this cap."},"cap_type":{"type":"string","description":"Cap tracked against a single Morpho Blue market via an adapter.","enum":["marketV1"]},"adapter_address":{"description":"Adapter contract address this cap constrains.","type":"string"},"market_id":{"description":"Morpho Blue market id this cap constrains.","type":"string"},"collateral_address":{"description":"Collateral token address of the constrained market.","type":"string"}},"required":["cap_id","history","cap_type","adapter_address","market_id","collateral_address"]},{"type":"object","properties":{"cap_id":{"description":"Vault V2 cap id.","type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"history":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Snapshot timestamp in Unix seconds."},"allocation":{"description":"Assets allocated to this cap target, in underlying token units.","type":"string","internalType":"bigint"},"absolute_cap":{"description":"Absolute allocation cap, in underlying token units.","type":"string","internalType":"bigint"},"relative_cap_wad":{"description":"Relative allocation cap scaled by WAD (1e18).","type":"string","internalType":"bigint"},"relative_allocation":{"type":"number","minimum":0,"description":"Allocation relative to vault total assets as a ratio."}},"required":["timestamp","allocation","absolute_cap","relative_cap_wad","relative_allocation"]},"description":"Historical allocation and cap points for this cap."},"cap_type":{"type":"string","description":"Cap tracked against a collateral token across every market adapter of the vault.","enum":["collateral"]},"collateral_address":{"description":"ERC-20 collateral token address this cap constrains.","type":"string"}},"required":["cap_id","history","cap_type","collateral_address"]},{"type":"object","properties":{"cap_id":{"description":"Vault V2 cap id.","type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"history":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Snapshot timestamp in Unix seconds."},"allocation":{"description":"Assets allocated to this cap target, in underlying token units.","type":"string","internalType":"bigint"},"absolute_cap":{"description":"Absolute allocation cap, in underlying token units.","type":"string","internalType":"bigint"},"relative_cap_wad":{"description":"Relative allocation cap scaled by WAD (1e18).","type":"string","internalType":"bigint"},"relative_allocation":{"type":"number","minimum":0,"description":"Allocation relative to vault total assets as a ratio."}},"required":["timestamp","allocation","absolute_cap","relative_cap_wad","relative_allocation"]},"description":"Historical allocation and cap points for this cap."},"cap_type":{"type":"string","description":"Cap whose cap_data does not match any known encoding, so its target could not be resolved.","enum":["unknown"]}},"required":["cap_id","history","cap_type"]}]},"description":"Vault V2 caps history grouped by cap."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical cap state.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"VaultV2AllocationsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault V2 contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to serve this allocation state.","type":"string","internalType":"bigint"},"allocations":{"type":"array","items":{"type":"object","properties":{"adapter_address":{"description":"Adapter contract address.","type":"string"},"adapter_kind":{"type":"string","enum":["morpho_market_v1","morpho_market_v1_v2","morpho_vault_v1","morpho_vault_v2","unknown"],"description":"Adapter implementation. Open-ended: new kinds ship additively, so treat unrecognized values as unknown."},"target":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","description":"Adapter supplying to Morpho Blue markets. A single adapter can serve several markets, so the markets themselves are listed per cap.","enum":["blue_market"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","description":"Adapter depositing into a Morpho Vault V1.","enum":["vault_v1"]},"vault_address":{"description":"Address of the Morpho Vault V1 the adapter deposits into.","type":"string"}},"required":["type","vault_address"]},{"type":"object","properties":{"type":{"type":"string","description":"Adapter depositing into a nested Morpho Vault V2.","enum":["vault_v2"]},"vault_address":{"description":"Address of the nested Morpho Vault V2 the adapter deposits into.","type":"string"}},"required":["type","vault_address"]},{"type":"object","properties":{"type":{"type":"string","description":"Adapter that was not deployed by a known Morpho factory, or whose target is neither a Vault V1 nor a Vault V2.","enum":["unknown"]},"target_address":{"type":"string","description":"On-chain target pointer when one is recorded, for diagnostics. Null when the adapter exposes no target.","nullable":true}},"required":["type","target_address"]}],"description":"Where this adapter routes the assets it receives."},"pending":{"type":"object","properties":{"removal":{"type":"object","properties":{"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds at which the pending change becomes executable."}},"required":["valid_at_timestamp"],"description":"Pending removal of this adapter from the vault. Null when no removal is pending.","nullable":true}},"required":["removal"],"description":"Pending governance changes scoped to this adapter."},"caps":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"cap_id":{"description":"Vault V2 cap id (bytes32 keccak256 hash of cap_data).","type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"cap_data":{"type":"string","pattern":"^0x([a-fA-F0-9]{2})*$","description":"Opaque ABI-encoded cap id preimage, as stored on chain. Decoding it yields the cap target."},"allocated_assets":{"description":"Assets currently allocated against this cap, in underlying token units.","type":"string","internalType":"bigint"},"absolute_cap":{"description":"Absolute allocation cap, in underlying token units. 2^256 - 1 means no effective absolute cap.","type":"string","internalType":"bigint"},"relative_cap_wad":{"description":"Relative allocation cap, scaled by WAD (1e18 = 100%).","type":"string","internalType":"bigint"},"pending":{"type":"object","properties":{"absolute_cap":{"type":"object","properties":{"value":{"description":"Pending cap value once executable.","type":"string","internalType":"bigint"},"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds at which the pending change becomes executable."}},"required":["valid_at_timestamp","value"],"description":"Pending absolute cap increase, in underlying token units. Null when no increase is pending. Absolute and relative cap increases are timelocked independently, so each carries its own valid_at_timestamp.","nullable":true},"relative_cap_wad":{"type":"object","properties":{"value":{"description":"Pending cap value once executable.","type":"string","internalType":"bigint"},"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds at which the pending change becomes executable."}},"required":["valid_at_timestamp","value"],"description":"Pending relative cap increase, scaled by WAD (1e18 = 100%). Null when no increase is pending.","nullable":true}},"required":["absolute_cap","relative_cap_wad"],"description":"Pending cap increases. Cap decreases are not timelocked and apply immediately, so they never appear here."},"real_assets":{"type":"string","internalType":"bigint","description":"Assets the adapter holds, in underlying token units, accrued to the read time. Matches the adapter's realAssets(). Unlike allocated_assets, which is updated only on allocate and deallocate, it includes interest earned since. The values across adapter caps sum to the vault-level allocated_assets served by the state route. Null when the vault's accrual state is unavailable or the adapter kind is not supported.","nullable":true},"cap_type":{"type":"string","description":"Cap tracked against the adapter as a whole, covering every position it holds.","enum":["adapter"]}},"required":["cap_id","cap_data","pending","cap_type","allocated_assets","absolute_cap","relative_cap_wad","real_assets"]},{"type":"object","properties":{"cap_id":{"description":"Vault V2 cap id (bytes32 keccak256 hash of cap_data).","type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"cap_data":{"type":"string","pattern":"^0x([a-fA-F0-9]{2})*$","description":"Opaque ABI-encoded cap id preimage, as stored on chain. Decoding it yields the cap target."},"allocated_assets":{"description":"Assets currently allocated against this cap, in underlying token units.","type":"string","internalType":"bigint"},"absolute_cap":{"description":"Absolute allocation cap, in underlying token units. 2^256 - 1 means no effective absolute cap.","type":"string","internalType":"bigint"},"relative_cap_wad":{"description":"Relative allocation cap, scaled by WAD (1e18 = 100%).","type":"string","internalType":"bigint"},"pending":{"type":"object","properties":{"absolute_cap":{"type":"object","properties":{"value":{"description":"Pending cap value once executable.","type":"string","internalType":"bigint"},"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds at which the pending change becomes executable."}},"required":["valid_at_timestamp","value"],"description":"Pending absolute cap increase, in underlying token units. Null when no increase is pending. Absolute and relative cap increases are timelocked independently, so each carries its own valid_at_timestamp.","nullable":true},"relative_cap_wad":{"type":"object","properties":{"value":{"description":"Pending cap value once executable.","type":"string","internalType":"bigint"},"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds at which the pending change becomes executable."}},"required":["valid_at_timestamp","value"],"description":"Pending relative cap increase, scaled by WAD (1e18 = 100%). Null when no increase is pending.","nullable":true}},"required":["absolute_cap","relative_cap_wad"],"description":"Pending cap increases. Cap decreases are not timelocked and apply immediately, so they never appear here."},"expected_supply_assets":{"type":"string","internalType":"bigint","description":"Assets the adapter supplies to this market, in underlying token units, accrued to the read time. Matches the adapter's expectedSupplyAssets(marketId). Unlike allocated_assets, which is updated only on allocate and deallocate, it includes interest earned since. Zero can also mean the accrual state predates the market position; allocated_assets is then the better estimate. Null when the vault's accrual state is unavailable or the adapter is not a Morpho Market V1 adapter.","nullable":true},"cap_type":{"type":"string","description":"Cap tracked against a single Morpho Blue market via an adapter.","enum":["market_v1"]},"market_id":{"description":"Morpho Blue market id this cap constrains.","type":"string"}},"required":["cap_id","cap_data","pending","cap_type","market_id","allocated_assets","absolute_cap","relative_cap_wad","expected_supply_assets"]}]},"description":"Caps scoped to this adapter: its own adapter-wide cap and one cap per Morpho Blue market it is capped on."}},"required":["adapter_address","adapter_kind","target","pending","caps"]},"description":"Active adapters of the vault with their caps and current allocations."},"unscoped_caps":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"cap_id":{"description":"Vault V2 cap id (bytes32 keccak256 hash of cap_data).","type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"cap_data":{"type":"string","pattern":"^0x([a-fA-F0-9]{2})*$","description":"Opaque ABI-encoded cap id preimage, as stored on chain. Decoding it yields the cap target."},"allocated_assets":{"description":"Assets currently allocated against this cap, in underlying token units.","type":"string","internalType":"bigint"},"absolute_cap":{"description":"Absolute allocation cap, in underlying token units. 2^256 - 1 means no effective absolute cap.","type":"string","internalType":"bigint"},"relative_cap_wad":{"description":"Relative allocation cap, scaled by WAD (1e18 = 100%).","type":"string","internalType":"bigint"},"pending":{"type":"object","properties":{"absolute_cap":{"type":"object","properties":{"value":{"description":"Pending cap value once executable.","type":"string","internalType":"bigint"},"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds at which the pending change becomes executable."}},"required":["valid_at_timestamp","value"],"description":"Pending absolute cap increase, in underlying token units. Null when no increase is pending. Absolute and relative cap increases are timelocked independently, so each carries its own valid_at_timestamp.","nullable":true},"relative_cap_wad":{"type":"object","properties":{"value":{"description":"Pending cap value once executable.","type":"string","internalType":"bigint"},"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds at which the pending change becomes executable."}},"required":["valid_at_timestamp","value"],"description":"Pending relative cap increase, scaled by WAD (1e18 = 100%). Null when no increase is pending.","nullable":true}},"required":["absolute_cap","relative_cap_wad"],"description":"Pending cap increases. Cap decreases are not timelocked and apply immediately, so they never appear here."},"cap_type":{"type":"string","description":"Cap tracked against a collateral token across every market adapter of the vault.","enum":["collateral"]},"collateral_address":{"description":"ERC-20 collateral token address this cap constrains.","type":"string"}},"required":["cap_id","cap_data","pending","cap_type","collateral_address","allocated_assets","absolute_cap","relative_cap_wad"]},{"type":"object","properties":{"cap_id":{"description":"Vault V2 cap id (bytes32 keccak256 hash of cap_data).","type":"string","pattern":"^0x[a-fA-F0-9]{64}$"},"cap_data":{"type":"string","pattern":"^0x([a-fA-F0-9]{2})*$","description":"Opaque ABI-encoded cap id preimage, as stored on chain. Decoding it yields the cap target."},"allocated_assets":{"description":"Assets currently allocated against this cap, in underlying token units.","type":"string","internalType":"bigint"},"absolute_cap":{"description":"Absolute allocation cap, in underlying token units. 2^256 - 1 means no effective absolute cap.","type":"string","internalType":"bigint"},"relative_cap_wad":{"description":"Relative allocation cap, scaled by WAD (1e18 = 100%).","type":"string","internalType":"bigint"},"pending":{"type":"object","properties":{"absolute_cap":{"type":"object","properties":{"value":{"description":"Pending cap value once executable.","type":"string","internalType":"bigint"},"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds at which the pending change becomes executable."}},"required":["valid_at_timestamp","value"],"description":"Pending absolute cap increase, in underlying token units. Null when no increase is pending. Absolute and relative cap increases are timelocked independently, so each carries its own valid_at_timestamp.","nullable":true},"relative_cap_wad":{"type":"object","properties":{"value":{"description":"Pending cap value once executable.","type":"string","internalType":"bigint"},"valid_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds at which the pending change becomes executable."}},"required":["valid_at_timestamp","value"],"description":"Pending relative cap increase, scaled by WAD (1e18 = 100%). Null when no increase is pending.","nullable":true}},"required":["absolute_cap","relative_cap_wad"],"description":"Pending cap increases. Cap decreases are not timelocked and apply immediately, so they never appear here."},"cap_type":{"type":"string","description":"Cap whose cap_data does not match any known encoding, so its target could not be resolved.","enum":["unknown"]}},"required":["cap_id","cap_data","pending","cap_type","allocated_assets","absolute_cap","relative_cap_wad"]}]},"description":"Caps that are not scoped to a single adapter: collateral caps, which constrain every market adapter holding that collateral, and caps whose target could not be decoded."}},"required":["chain_id","vault_address","allocations","unscoped_caps","last_indexed_block"],"description":"Vault V2 adapter and cap allocation state."}},"required":["data"]},"VaultV2ApyAveragesResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault contract address.","type":"string"},"last_indexed_block":{"description":"Latest indexed block used to compute this APY average.","type":"string","internalType":"bigint"},"lookback":{"type":"string","enum":["one_hour","six_hours","one_day","seven_days","thirty_days","ninety_days","one_year","inception"],"description":"Lookback period used to compute the average APY."},"apy":{"type":"number","description":"Realized average APY of the vault, calculated from share price evolution over the lookback period.","nullable":true}},"required":["chain_id","vault_address","lookback","apy"],"description":"Vault V2 realized average APY."}},"required":["data"]},"VaultV2ApyHistoryResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"string","pattern":"^\\d+$","description":"EVM chain identifier from the vault selector."},"vault_address":{"description":"Vault contract address from the vault selector.","type":"string"}},"required":["chain_id","vault_address"],"description":"Request selector parameters."},"data":{"type":"array","items":{"type":"object","properties":{"timestamp":{"type":"integer","minimum":0,"description":"Historical sample timestamp in Unix seconds."},"apy":{"type":"number","description":"Historical vault APY.","nullable":true}},"required":["timestamp","apy"]},"description":"Vault V2 historical APY points."},"last_indexed_block":{"description":"Latest indexed block used to serve this historical APY.","type":"string","internalType":"bigint"}},"required":["params","data","last_indexed_block"]},"VaultV2PendingGovernanceActionsResponse":{"type":"object","properties":{"params":{"type":"object","properties":{"chain_id":{"type":"number","enum":[1,8453,747474,999,42161,137,130,10,480,143,988,4217,4663,5042,196],"description":"EVM chain identifier."},"vault_address":{"description":"Vault contract address.","type":"string"}},"required":["chain_id","vault_address"]},"data":{"type":"array","items":{"oneOf":[{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_is_allocator"]},"parameters":{"type":"object","properties":{"account":{"description":"Allocator account address.","type":"string"},"is_allocator":{"type":"boolean","description":"Whether the account becomes allocator."}},"required":["account","is_allocator"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_receive_shares_gate"]},"parameters":{"type":"object","properties":{"new_gate":{"description":"Pending gate contract address.","type":"string"}},"required":["new_gate"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_send_shares_gate"]},"parameters":{"type":"object","properties":{"new_gate":{"description":"Pending gate contract address.","type":"string"}},"required":["new_gate"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_receive_assets_gate"]},"parameters":{"type":"object","properties":{"new_gate":{"description":"Pending gate contract address.","type":"string"}},"required":["new_gate"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_send_assets_gate"]},"parameters":{"type":"object","properties":{"new_gate":{"description":"Pending gate contract address.","type":"string"}},"required":["new_gate"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_adapter_registry"]},"parameters":{"type":"object","properties":{"new_adapter_registry":{"description":"Pending adapter registry address.","type":"string"}},"required":["new_adapter_registry"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["add_adapter"]},"parameters":{"type":"object","properties":{"adapter":{"description":"Adapter contract address.","type":"string"}},"required":["adapter"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["remove_adapter"]},"parameters":{"type":"object","properties":{"adapter":{"description":"Adapter contract address.","type":"string"}},"required":["adapter"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["increase_timelock"]},"parameters":{"type":"object","properties":{"selector":{"type":"string","pattern":"^0x[a-fA-F0-9]{8}$","description":"Four-byte function selector."},"new_duration_seconds":{"type":"string","pattern":"^\\d+$","description":"Pending timelock duration, in seconds."}},"required":["selector","new_duration_seconds"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["decrease_timelock"]},"parameters":{"type":"object","properties":{"selector":{"type":"string","pattern":"^0x[a-fA-F0-9]{8}$","description":"Four-byte function selector."},"new_duration_seconds":{"type":"string","pattern":"^\\d+$","description":"Pending timelock duration, in seconds."}},"required":["selector","new_duration_seconds"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["abdicate"]},"parameters":{"type":"object","properties":{"selector":{"type":"string","pattern":"^0x[a-fA-F0-9]{8}$","description":"Four-byte function selector."}},"required":["selector"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_performance_fee"]},"parameters":{"type":"object","properties":{"new_fee_wad":{"description":"Pending fee value, scaled by WAD (1e18 = 100%).","type":"string","internalType":"bigint"}},"required":["new_fee_wad"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_management_fee"]},"parameters":{"type":"object","properties":{"new_fee_wad":{"description":"Pending fee value, scaled by WAD (1e18 = 100%).","type":"string","internalType":"bigint"}},"required":["new_fee_wad"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_performance_fee_recipient"]},"parameters":{"type":"object","properties":{"new_recipient":{"description":"Pending fee recipient address.","type":"string"}},"required":["new_recipient"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_management_fee_recipient"]},"parameters":{"type":"object","properties":{"new_recipient":{"description":"Pending fee recipient address.","type":"string"}},"required":["new_recipient"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["increase_absolute_cap"]},"parameters":{"type":"object","properties":{"id_data":{"type":"string","description":"Adapter-specific cap id calldata."},"new_absolute_cap":{"description":"Pending absolute cap in underlying token units.","type":"string","internalType":"bigint"}},"required":["id_data","new_absolute_cap"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["increase_relative_cap"]},"parameters":{"type":"object","properties":{"id_data":{"type":"string","description":"Adapter-specific cap id calldata."},"new_relative_cap_wad":{"description":"Pending relative cap, scaled by WAD (1e18 = 100%).","type":"string","internalType":"bigint"}},"required":["id_data","new_relative_cap_wad"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["set_force_deallocate_penalty"]},"parameters":{"type":"object","properties":{"adapter":{"description":"Adapter contract address.","type":"string"},"new_penalty_wad":{"description":"Pending force deallocation penalty, scaled by WAD (1e18 = 100%).","type":"string","internalType":"bigint"}},"required":["adapter","new_penalty_wad"]}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]},{"type":"object","properties":{"submitted_transaction_hash":{"type":"string","pattern":"^0x[a-fA-F0-9]{64}$","description":"Transaction hash that submitted the pending governance action."},"executable_at_timestamp":{"type":"integer","minimum":0,"description":"Unix seconds when the action becomes executable."},"action_type":{"type":"string","enum":["unknown"]},"parameters":{"type":"null"}},"required":["submitted_transaction_hash","executable_at_timestamp","action_type","parameters"]}]},"description":"Pending governance actions for this Vault V2."},"cursor":{"type":"string","description":"Opaque pagination cursor.","nullable":true},"last_indexed_block":{"description":"Latest indexed block used to compute this pending action list.","type":"string","internalType":"bigint"}},"required":["params","data","cursor","last_indexed_block"]},"VaultV2WithdrawalOptionsResponse":{"type":"object","properties":{"data":{"type":"object","properties":{"chain_id":{"type":"integer","exclusiveMinimum":true,"description":"EVM chain identifier.","minimum":0},"vault_address":{"description":"Vault V2 contract address.","type":"string"},"liquidity_adapter_available_assets":{"description":"Assets currently withdrawable through the configured liquidity adapter, excluding idle assets.","type":"string","internalType":"bigint"},"idle_assets":{"description":"Assets held idle by the vault and immediately withdrawable.","type":"string","internalType":"bigint"},"adapter_penalties":{"type":"array","items":{"type":"object","properties":{"adapter_address":{"description":"Vault V2 adapter address.","type":"string"},"adapter_kind":{"type":"string","enum":["blue_market_adapter","vault_v1_adapter","vault_v2_adapter","unknown_adapter"],"description":"Resolved adapter kind."},"force_deallocatable_assets":{"description":"Assets that can currently be force-deallocated from this adapter, in underlying token units.","type":"string","internalType":"bigint"},"penalty_rate_wad":{"description":"Force-deallocation penalty rate for this adapter, scaled by WAD (1e18).","type":"string","internalType":"bigint"}},"required":["adapter_address","adapter_kind","force_deallocatable_assets","penalty_rate_wad"]},"description":"One force-deallocation option per active adapter."}},"required":["chain_id","vault_address","liquidity_adapter_available_assets","idle_assets","adapter_penalties"],"description":"Vault V2 withdrawal options."}},"required":["data"]}}}}