{"openapi":"3.0.0","paths":{"/morphoCache":{"get":{"operationId":"MorphoCacheController_getCache","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache"]}},"/morphoCache/lite":{"get":{"operationId":"MorphoCacheController_getLiteCache","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache"]}},"/morphoCache/allocations":{"get":{"operationId":"MorphoCacheController_getMarketAllocations","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache"]}},"/morphoCache/vaults-data":{"get":{"operationId":"MorphoCacheController_getVaultsData","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache"]}},"/morphoCache/leverage-cache":{"get":{"operationId":"MorphoCacheController_getLeverageCache","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache"]}},"/morphoCache/get-market-irm":{"get":{"operationId":"MorphoCacheController_getIRMDataByAddress","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache"]}},"/morphoCache/flare":{"get":{"operationId":"MorphoCacheController_getFlareVaults","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache"]}},"/morphoCache/flare/markets":{"get":{"operationId":"MorphoCacheController_getFlareMarkets","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache"]}},"/morphoCache/vault-history":{"get":{"operationId":"MorphoCacheController_getVaultHistory","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache"]}},"/morphoCache/market-history":{"get":{"operationId":"MorphoCacheController_getMarketHistory","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache"]}},"/morphoCache/admin/api-keys":{"post":{"operationId":"MorphoApiKeyController_create","summary":"Issue a new API key","description":"The plaintext key is returned ONCE in this response and is not recoverable — deliver it to the customer immediately.","parameters":[{"name":"x-morpho-admin-key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"}}}},"responses":{"201":{"description":"Key created; plaintext returned once."}},"tags":["MorphoCache Admin"]}},"/morphoCache/admin/api-keys/plans":{"get":{"operationId":"MorphoApiKeyController_plans","summary":"The published plan catalogue and credit costs","description":"Machine-readable copy of docs.mysticfinance.xyz/api/plans-and-pricing: every plan with its included credits and rate limit, plus the endpoints that cost more (or less) than the flat 1 credit.","parameters":[{"name":"x-morpho-admin-key","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache Admin"]}},"/morphoCache/admin/api-keys/usage":{"get":{"operationId":"MorphoApiKeyController_usage","summary":"Requests and credits per API key, by day range","description":"Returns `{ label: { requests, credits, failedRequests } }`. `requests` is all traffic; `credits` is what is billable — failed requests are counted but never charged, and heavy endpoints cost more than 1. Optionally bounded by ?from= and ?to= ('YYYY-MM-DD', inclusive). Keyless traffic — our own UI, or anything served while the guard flag is off — aggregates under '-'; pass ?excludeKeyless=true to omit it.","parameters":[{"name":"x-morpho-admin-key","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache Admin"]}},"/morphoCache/admin/api-keys/billing":{"get":{"operationId":"MorphoApiKeyController_billing","summary":"Billing ledger for a cycle, across all keys","description":"One row per key per billing cycle: credits used against the allowance, overage in USD, request counts and peak throughput. Defaults to every cycle, newest first; pass ?cycle=YYYY-MM-DD (the cycle start) to narrow.","parameters":[{"name":"x-morpho-admin-key","in":"header","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache Admin"]}},"/morphoCache/admin/api-keys/{id}/usage":{"get":{"operationId":"MorphoApiKeyController_keyUsage","summary":"One key's current billing cycle","description":"Credits used against the allowance, overage in USD, request counts, and peak throughput for the cycle in progress. Pass ?cycle=YYYY-MM-DD to read a past cycle.","parameters":[{"name":"x-morpho-admin-key","in":"header","required":true,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache Admin"]}},"/morphoCache/admin/api-keys/{id}/disable":{"patch":{"operationId":"MorphoApiKeyController_disable","summary":"Disable a key (takes effect on the next request)","parameters":[{"name":"x-morpho-admin-key","in":"header","required":true,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache Admin"]}},"/morphoCache/admin/api-keys/{id}/enable":{"patch":{"operationId":"MorphoApiKeyController_enable","summary":"Re-enable a previously disabled key","parameters":[{"name":"x-morpho-admin-key","in":"header","required":true,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["MorphoCache Admin"]}},"/morphoCache/admin/api-keys/{id}/renew":{"patch":{"operationId":"MorphoApiKeyController_renew","summary":"Extend access after payment","description":"Extends from the current expiry when the key is still live, or from now when it has lapsed. `days: 0` removes the expiry.","parameters":[{"name":"x-morpho-admin-key","in":"header","required":true,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenewKeyDto"}}}},"responses":{"200":{"description":""}},"tags":["MorphoCache Admin"]}},"/v1/yields/health":{"get":{"operationId":"YieldsReferenceController_health","summary":"Check API health and data freshness","description":"Per-network cache age in seconds, so a caller can decide what staleness they tolerate rather than trusting a bare 200.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Reference"]}},"/v1/yields/networks":{"get":{"operationId":"YieldsReferenceController_networks","summary":"List supported networks","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Reference"]}},"/v1/yields/protocols":{"get":{"operationId":"YieldsReferenceController_protocols","summary":"List supported protocols","description":"Each protocol declares its capabilities, so a caller can see what it can and cannot answer before asking.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Reference"]}},"/v1/yields/tags":{"get":{"operationId":"YieldsReferenceController_tags","summary":"List vault tags with live counts","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Reference"]}},"/v1/yields/curators":{"get":{"operationId":"YieldsReferenceController_curators","summary":"List curators with vault counts and TVL","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page. Unlike the legacy /morphoCache endpoints, omitting this returns a page, not the entire list.","schema":{"minimum":1,"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id (e.g. `plume,base` or `98866,8453`). Unknown entries are reported in `errors.unsupportedNetworks` rather than failing the request.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedNetworks","required":false,"in":"query","description":"Networks to exclude, by slug or chain id.","schema":{"type":"array","items":{"type":"string"}}},{"name":"chainId","required":false,"in":"query","description":"Alias for `allowedNetworks` with a single chain id, for callers migrating from /morphoCache.","schema":{"type":"number"}},{"name":"search","required":false,"in":"query","description":"Free-text match on name, symbol or address.","schema":{"type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"desc","enum":["asc","desc"],"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Reference"]}},"/v1/yields/assets":{"get":{"operationId":"YieldsReferenceController_assets","summary":"List assets","description":"Every asset used by a vault or market we index, with where it is used.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page. Unlike the legacy /morphoCache endpoints, omitting this returns a page, not the entire list.","schema":{"minimum":1,"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id (e.g. `plume,base` or `98866,8453`). Unknown entries are reported in `errors.unsupportedNetworks` rather than failing the request.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedNetworks","required":false,"in":"query","description":"Networks to exclude, by slug or chain id.","schema":{"type":"array","items":{"type":"string"}}},{"name":"chainId","required":false,"in":"query","description":"Alias for `allowedNetworks` with a single chain id, for callers migrating from /morphoCache.","schema":{"type":"number"}},{"name":"search","required":false,"in":"query","description":"Free-text match on name, symbol or address.","schema":{"type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"name":"assetGroup","required":false,"in":"query","description":"Coarse asset buckets to include.","schema":{"type":"array","items":{"type":"string","enum":["usd","eth","btc","rwa","other"]}}}],"responses":{"200":{"description":""}},"tags":["Yields · Reference"]}},"/v1/yields/assets/{network}/{address}":{"get":{"operationId":"YieldsReferenceController_asset","summary":"Get asset","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","example":"plume","description":"Network slug.","schema":{"type":"string"}},{"name":"address","required":true,"in":"path","example":"0x1234abcd…","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Reference"]}},"/v1/yields/vaults":{"get":{"operationId":"YieldsVaultsController_list","summary":"List vaults","description":"Yield-bearing vaults across every supported protocol and network. Defaults to ALL networks — unlike the legacy /morphoCache endpoints, an omitted network filter is not silently treated as Plume.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page. Unlike the legacy /morphoCache endpoints, omitting this returns a page, not the entire list.","schema":{"minimum":1,"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id (e.g. `plume,base` or `98866,8453`). Unknown entries are reported in `errors.unsupportedNetworks` rather than failing the request.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedNetworks","required":false,"in":"query","description":"Networks to exclude, by slug or chain id.","schema":{"type":"array","items":{"type":"string"}}},{"name":"chainId","required":false,"in":"query","description":"Alias for `allowedNetworks` with a single chain id, for callers migrating from /morphoCache.","schema":{"type":"number"}},{"name":"search","required":false,"in":"query","description":"Free-text match on name, symbol or address.","schema":{"type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"name":"expand","required":false,"in":"query","description":"Nested objects to return in full. By default `score` carries the headline number only; `?expand=score` adds the component breakdown the detail endpoint returns.","schema":{"type":"array","items":{"type":"string","enum":["score"]}}},{"name":"sortBy","required":false,"in":"query","schema":{"default":"tvl","enum":["tvl","apy","liquidity","name","score","createdAt","holders"],"type":"string"}},{"name":"allowedAssets","required":false,"in":"query","description":"Vault assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedAssets","required":false,"in":"query","description":"Vault assets to exclude, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"assetGroup","required":false,"in":"query","description":"Coarse asset buckets to include.","schema":{"type":"array","items":{"type":"string","enum":["usd","eth","btc","rwa","other"]}}},{"name":"allowedProtocols","required":false,"in":"query","description":"Protocols to include (see GET /v1/yields/protocols).","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedProtocols","required":false,"in":"query","description":"Protocols to exclude.","schema":{"type":"array","items":{"type":"string"}}},{"name":"curators","required":false,"in":"query","description":"Curators to include, by name or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"tags","required":false,"in":"query","description":"Tags to include (see GET /v1/yields/tags).","schema":{"type":"array","items":{"type":"string"}}},{"name":"minTvl","required":false,"in":"query","description":"Minimum TVL in USD.","schema":{"type":"number"}},{"name":"maxTvl","required":false,"in":"query","description":"Maximum TVL in USD.","schema":{"type":"number"}},{"name":"minApy","required":false,"in":"query","description":"Minimum total APY, as a decimal fraction (0.05 = 5%).","schema":{"type":"number"}},{"name":"maxApy","required":false,"in":"query","description":"Maximum total APY, as a decimal fraction (0.05 = 5%).","schema":{"type":"number"}},{"name":"apyInterval","required":false,"in":"query","description":"Which APY window `minApy`/`maxApy`/`sortBy=apy` read. Trailing windows arrive with the history pipeline; until then only `1day` is populated.","schema":{"default":"1day","enum":["instantaneous","1hour","1day","7day","30day"],"type":"string"}},{"name":"minLiquidity","required":false,"in":"query","description":"Minimum liquidity in USD.","schema":{"type":"number"}},{"name":"minVaultScore","required":false,"in":"query","description":"Minimum Vault Score (0-100). See docs/api/vault-score.md for the methodology. Vaults with no computed score are excluded — an unscored vault cannot satisfy a score floor.","schema":{"minimum":0,"maximum":100,"type":"number"}},{"name":"view","required":false,"in":"query","description":"Response detail. `full` (default) returns the complete vault object; `slim` returns only identity, asset, headline APY and TVL — enough to render a list or resolve ids, at a fraction of the payload. A query parameter rather than a second route, so filters and sorting behave identically either way.","schema":{"default":"full","enum":["full","slim"],"type":"string"}},{"name":"version","required":false,"in":"query","description":"Protocol version to include.","schema":{"default":"all","enum":["v1","v2","all"],"type":"string"}}],"responses":{"200":{"description":"A page of vaults. `errors` names any filter values we could not resolve, so one bad network does not fail the whole query."}},"tags":["Yields"]}},"/v1/yields/vaults/{network}/{vaultId}":{"get":{"operationId":"YieldsVaultsController_get","summary":"Get vault","description":"One vault in full. Returns 404 when it does not exist — never a 200 with a null body.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","example":"plume","description":"Network slug.","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","example":"0x1234abcd…","description":"Vault contract address.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields"]}},"/v1/yields/vaults/{network}/{vaultId}/apy":{"get":{"operationId":"YieldsVaultsController_apy","summary":"Get vault APY","description":"The APY breakdown alone — a cheap poll for callers tracking rates. Trailing windows are null until the history pipeline populates them; the spot rate is never copied into them.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields"]}},"/v1/yields/vaults/{network}/{vaultId}/allocations":{"get":{"operationId":"YieldsVaultsController_allocations","summary":"List where a vault deploys its assets","description":"Market allocations, V2 vault-to-vault allocations, and the idle slice, largest share first. Shares are fractions of the vault total and include idle, so they sum to 1. Also present inline on the vault detail response.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields"]}},"/v1/yields/vaults/{network}/{vaultId}/campaigns":{"get":{"operationId":"YieldsVaultsController_listCampaigns","summary":"List reward campaigns on this vault","description":"Reward token, budget and end date, live from Merkl. `rewards[]` on the vault answers \"how much\"; this answers \"from what, and until when\" — the part that decides whether a headline APY is durable.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields"]}},"/v1/yields/vaults/{network}/{vaultId}/holders":{"get":{"operationId":"YieldsVaultsController_holders","summary":"List vault holders","description":"Total holder count plus the largest positions. Requires an indexer, so networks we do not index return an explicit `unavailableReason` rather than an empty list.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Holders per page.","schema":{"maximum":500,"default":50,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields"]}},"/v1/yields/vaults/{network}/{vaultId}/tvl":{"get":{"operationId":"YieldsVaultsController_tvl","summary":"Get vault TVL","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields"]}},"/v1/yields/borrow/markets":{"get":{"operationId":"YieldsBorrowController_list","summary":"List borrow markets","description":"Lending markets across every supported protocol and network. Bad-debt and unverified (spam) markets are EXCLUDED by default — pass includeBadDebt/includeUnverified to see them.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page. Unlike the legacy /morphoCache endpoints, omitting this returns a page, not the entire list.","schema":{"minimum":1,"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id (e.g. `plume,base` or `98866,8453`). Unknown entries are reported in `errors.unsupportedNetworks` rather than failing the request.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedNetworks","required":false,"in":"query","description":"Networks to exclude, by slug or chain id.","schema":{"type":"array","items":{"type":"string"}}},{"name":"chainId","required":false,"in":"query","description":"Alias for `allowedNetworks` with a single chain id, for callers migrating from /morphoCache.","schema":{"type":"number"}},{"name":"search","required":false,"in":"query","description":"Free-text match on name, symbol or address.","schema":{"type":"string"}},{"name":"sortOrder","required":false,"in":"query","schema":{"default":"desc","enum":["asc","desc"],"type":"string"}},{"name":"minMarketScore","required":false,"in":"query","description":"Minimum Market Score, 0-100.","schema":{"minimum":0,"maximum":100,"type":"number"}},{"name":"expand","required":false,"in":"query","description":"Nested collections to return in full. By default `supplyingVaults` carries identity fields only — everything /morphoCache/lite published, plus ids — and `?expand=supplyingVaults` returns every field the detail endpoint has.","schema":{"type":"array","items":{"type":"string","enum":["supplyingVaults","score"]}}},{"name":"sortBy","required":false,"in":"query","schema":{"default":"tvl","enum":["tvl","supplyApy","borrowApy","utilization","liquidity","lltv","score"],"type":"string"}},{"name":"allowedCollateralAssets","required":false,"in":"query","description":"Collateral assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedCollateralAssets","required":false,"in":"query","description":"Collateral assets to exclude.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedBorrowAssets","required":false,"in":"query","description":"Borrowable (loan) assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedBorrowAssets","required":false,"in":"query","description":"Borrowable (loan) assets to exclude.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedProtocols","required":false,"in":"query","description":"Protocols to include.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedProtocols","required":false,"in":"query","description":"Protocols to exclude.","schema":{"type":"array","items":{"type":"string"}}},{"name":"tags","required":false,"in":"query","description":"Tags to include.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minTvl","required":false,"in":"query","description":"Minimum total supplied, in USD.","schema":{"type":"number"}},{"name":"maxTvl","required":false,"in":"query","description":"Maximum total supplied, in USD.","schema":{"type":"number"}},{"name":"minLltv","required":false,"in":"query","description":"Minimum LLTV, as a decimal fraction (0.86 = 86%).","schema":{"type":"number"}},{"name":"maxLltv","required":false,"in":"query","description":"Maximum LLTV, as a decimal fraction.","schema":{"type":"number"}},{"name":"minUtilization","required":false,"in":"query","description":"Minimum utilization, as a decimal fraction.","schema":{"type":"number"}},{"name":"maxUtilization","required":false,"in":"query","description":"Maximum utilization, as a decimal fraction.","schema":{"type":"number"}},{"name":"minBorrowApy","required":false,"in":"query","description":"Minimum borrow APY, as a decimal fraction.","schema":{"type":"number"}},{"name":"maxBorrowApy","required":false,"in":"query","description":"Maximum borrow APY, as a decimal fraction.","schema":{"type":"number"}},{"name":"hasLiquidity","required":false,"in":"query","description":"Only markets with borrowable liquidity available.","schema":{"type":"boolean"}},{"name":"includeBadDebt","required":false,"in":"query","description":"Include markets whose reported supply is unrecoverable bad debt rather than real deposits.","schema":{"default":false,"type":"boolean"}},{"name":"includeUnverified","required":false,"in":"query","description":"Include markets Morpho's index carries but publishes no state for — its marker for spam.","schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"description":"A page of borrow markets."}},"tags":["Yields · Borrow"]}},"/v1/yields/borrow/markets/{network}/{marketId}":{"get":{"operationId":"YieldsBorrowController_get","summary":"Get borrow market","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","example":"plume","description":"Network slug.","schema":{"type":"string"}},{"name":"marketId","required":true,"in":"path","example":"0x7489a392…","description":"The 32-byte market id.","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Borrow"]}},"/v1/yields/borrow/markets/{network}/{marketId}/allocations":{"get":{"operationId":"YieldsBorrowController_allocations","summary":"List supplying vaults","description":"Which vaults supply this market, and how much each has allocated.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"marketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Borrow"]}},"/v1/yields/historical/asset-prices/{network}/{address}":{"get":{"operationId":"YieldsHistoricalController_assetPrices","summary":"Get historical asset prices","description":"Derived from the vault history series: each point carries both native and USD totals, so their ratio is the price the pipeline observed at that moment.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","example":"plume","schema":{"type":"string"}},{"name":"address","required":true,"in":"path","example":"0x1234abcd…","description":"Asset contract address.","schema":{"type":"string"}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds (inclusive).","example":1735689600,"schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds (inclusive).","example":1767225600,"schema":{"type":"number"}},{"name":"granularity","required":false,"in":"query","description":"Bucket size. Each bucket keeps its closing value — these are point-in-time readings, so averaging would invent a number that never existed. Omit for the raw series.","schema":{"enum":["1hour","1day","1week"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Points per page.","schema":{"maximum":1000,"default":500,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Historical"]}},"/v1/yields/historical/borrow/{network}/{marketId}":{"get":{"operationId":"YieldsHistoricalController_marketHistory","summary":"Get borrow market history","description":"Supply, borrow, liquidity, rates and utilization over time.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"marketId","required":true,"in":"path","schema":{"type":"string"}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds (inclusive).","example":1735689600,"schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds (inclusive).","example":1767225600,"schema":{"type":"number"}},{"name":"granularity","required":false,"in":"query","description":"Bucket size. Each bucket keeps its closing value — these are point-in-time readings, so averaging would invent a number that never existed. Omit for the raw series.","schema":{"enum":["1hour","1day","1week"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Points per page.","schema":{"maximum":1000,"default":500,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Historical"]}},"/v1/yields/historical/{network}/{vaultId}/daily-flows":{"get":{"operationId":"YieldsHistoricalController_dailyFlows","summary":"Get daily deposit and withdrawal flows","description":"Net flow per day, counted from actual transfers rather than differenced from TVL — a TVL delta conflates flows with yield accrual and price movement, so a vault that took no deposits but whose asset appreciated would show a fabricated inflow.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds (inclusive).","example":1735689600,"schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds (inclusive).","example":1767225600,"schema":{"type":"number"}},{"name":"granularity","required":false,"in":"query","description":"Bucket size. Each bucket keeps its closing value — these are point-in-time readings, so averaging would invent a number that never existed. Omit for the raw series.","schema":{"enum":["1hour","1day","1week"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Points per page.","schema":{"maximum":1000,"default":500,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Historical"]}},"/v1/yields/historical/{network}/{vaultId}/apy":{"get":{"operationId":"YieldsHistoricalController_apy","summary":"Get historical APY","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds (inclusive).","example":1735689600,"schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds (inclusive).","example":1767225600,"schema":{"type":"number"}},{"name":"granularity","required":false,"in":"query","description":"Bucket size. Each bucket keeps its closing value — these are point-in-time readings, so averaging would invent a number that never existed. Omit for the raw series.","schema":{"enum":["1hour","1day","1week"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Points per page.","schema":{"maximum":1000,"default":500,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Historical"]}},"/v1/yields/historical/{network}/{vaultId}/tvl":{"get":{"operationId":"YieldsHistoricalController_tvl","summary":"Get historical TVL","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds (inclusive).","example":1735689600,"schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds (inclusive).","example":1767225600,"schema":{"type":"number"}},{"name":"granularity","required":false,"in":"query","description":"Bucket size. Each bucket keeps its closing value — these are point-in-time readings, so averaging would invent a number that never existed. Omit for the raw series.","schema":{"enum":["1hour","1day","1week"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Points per page.","schema":{"maximum":1000,"default":500,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Historical"]}},"/v1/yields/historical/{network}/{vaultId}/share-price":{"get":{"operationId":"YieldsHistoricalController_sharePrice","summary":"Get historical share price","description":"Assets per share over time. Requires indexed share supply, so it is unavailable on networks we do not index — those return an empty series with an explicit `unavailableReason` rather than pretending the vault has no history.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds (inclusive).","example":1735689600,"schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds (inclusive).","example":1767225600,"schema":{"type":"number"}},{"name":"granularity","required":false,"in":"query","description":"Bucket size. Each bucket keeps its closing value — these are point-in-time readings, so averaging would invent a number that never existed. Omit for the raw series.","schema":{"enum":["1hour","1day","1week"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Points per page.","schema":{"maximum":1000,"default":500,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Historical"]}},"/v1/yields/historical/{network}/{vaultId}":{"get":{"operationId":"YieldsHistoricalController_vaultHistory","summary":"Get vault historical data","description":"TVL, APY, liquidity and implied asset price in one series.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","example":"plume","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","example":"0x1234abcd…","schema":{"type":"string"}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds (inclusive).","example":1735689600,"schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds (inclusive).","example":1767225600,"schema":{"type":"number"}},{"name":"granularity","required":false,"in":"query","description":"Bucket size. Each bucket keeps its closing value — these are point-in-time readings, so averaging would invent a number that never existed. Omit for the raw series.","schema":{"enum":["1hour","1day","1week"],"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Points per page.","schema":{"maximum":1000,"default":500,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Historical"]}},"/v1/yields/portfolio/idle-assets/{address}":{"get":{"operationId":"YieldsPortfolioController_idleAssets","summary":"List idle assets","description":"Wallet balances not deployed into any vault we index. Scoped to a curated asset universe (every asset our vaults and markets use, plus a short extras list) rather than every ERC-20 the wallet has touched — an open scan surfaces airdropped spam with fabricated prices. \"Idle\" is also relative to our universe: a token in a protocol we do not index reads as idle here.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","example":"0x1234abcd…","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":200,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedAssets","required":false,"in":"query","description":"Assets to exclude, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Ignore balances worth less than this in USD. Defaults to $1 — below that, gas exceeds the yield.","schema":{"default":1,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/best-vault/{address}":{"get":{"operationId":"YieldsPortfolioController_bestVault","summary":"Get the best vault per idle asset","description":"Highest-yielding vault for each asset the wallet holds idle, with projected annual earnings on that balance. Restricted to vaults denominated in the same asset — a recommendation that silently requires a swap would be misleading.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":200,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedAssets","required":false,"in":"query","description":"Assets to exclude, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Ignore balances worth less than this in USD. Defaults to $1 — below that, gas exceeds the yield.","schema":{"default":1,"type":"number"}},{"name":"apyInterval","required":false,"in":"query","description":"Which APY window to rank on.","schema":{"default":"1day","enum":["instantaneous","1hour","1day","7day","30day"],"type":"string"}},{"name":"minTvl","required":false,"in":"query","description":"Only consider vaults above this TVL, in USD.","schema":{"type":"number"}},{"name":"maxVaultsPerAsset","required":false,"in":"query","description":"How many vaults to return per asset.","schema":{"maximum":10,"default":3,"type":"number"}},{"name":"alwaysReturnAssets","required":false,"in":"query","description":"Include assets for which no matching vault was found, instead of dropping them.","schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/best-deposit-options/{address}":{"get":{"operationId":"YieldsPortfolioController_bestDepositOptions","summary":"Get the top vaults per idle asset","description":"As best-vault, but returns several options per asset.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":200,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"disallowedAssets","required":false,"in":"query","description":"Assets to exclude, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Ignore balances worth less than this in USD. Defaults to $1 — below that, gas exceeds the yield.","schema":{"default":1,"type":"number"}},{"name":"apyInterval","required":false,"in":"query","description":"Which APY window to rank on.","schema":{"default":"1day","enum":["instantaneous","1hour","1day","7day","30day"],"type":"string"}},{"name":"minTvl","required":false,"in":"query","description":"Only consider vaults above this TVL, in USD.","schema":{"type":"number"}},{"name":"maxVaultsPerAsset","required":false,"in":"query","description":"How many vaults to return per asset.","schema":{"maximum":10,"default":3,"type":"number"}},{"name":"alwaysReturnAssets","required":false,"in":"query","description":"Include assets for which no matching vault was found, instead of dropping them.","schema":{"default":false,"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/summary/{address}":{"get":{"operationId":"YieldsPortfolioController_summary","summary":"Get portfolio summary","description":"Supplied, collateral, debt, net worth, TVL-weighted APY, projected annual earnings and the lowest health factor, in one call. Replaces roughly five separate requests.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","example":"0x1234abcd…","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id. Networks we do not index are reported in `errors.unsupportedNetworks` — a portfolio that silently omits a chain is worse than one that says it cannot see it.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Suppress positions worth less than this in USD. A wallet that has ever touched a vault keeps a rounding-dust position forever.","schema":{"default":0.01,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/historical-positions/{address}":{"get":{"operationId":"YieldsPortfolioController_historicalPositions","summary":"List every vault the wallet has ever held","description":"Including fully-exited ones, with when each opened and last saw activity. `positions` only shows current holdings, so a wallet that exited last month vanishes from it entirely.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id. Networks we do not index are reported in `errors.unsupportedNetworks` — a portfolio that silently omits a chain is worse than one that says it cannot see it.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Suppress positions worth less than this in USD. A wallet that has ever touched a vault keeps a rounding-dust position forever.","schema":{"default":0.01,"type":"number"}},{"name":"eventType","required":false,"in":"query","description":"Restrict to these event types.","schema":{"type":"array","items":{"type":"string","enum":["deposit","withdraw","borrow","repay","liquidation"]}}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds.","schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds.","schema":{"type":"number"}},{"name":"includeClosed","required":false,"in":"query","description":"Include vaults the wallet has fully exited. Defaults to true — a closed position is the part `positions` cannot show you.","schema":{"default":true,"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/historical-balances/{address}/{timestamp}":{"get":{"operationId":"YieldsPortfolioController_historicalBalances","summary":"Reconstruct balances at a past timestamp","description":"Replayed from the transfer stream. Reports net contributed, NOT position value: yield accrued between events is not recoverable from transfers, and USD is at the current asset price. Both caveats are on the response.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"timestamp","required":true,"in":"path","example":1735689600,"description":"Unix seconds.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id. Networks we do not index are reported in `errors.unsupportedNetworks` — a portfolio that silently omits a chain is worse than one that says it cannot see it.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Suppress positions worth less than this in USD. A wallet that has ever touched a vault keeps a rounding-dust position forever.","schema":{"default":0.01,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/partial-returns/{address}/{network}/{vaultId}":{"get":{"operationId":"YieldsPortfolioController_partialReturns","summary":"Get returns between two timestamps","description":"Period performance rather than lifetime. Contributions made inside the window are subtracted, so a mid-window deposit does not read as a gain. Requires fromTimestamp and toTimestamp.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id. Networks we do not index are reported in `errors.unsupportedNetworks` — a portfolio that silently omits a chain is worse than one that says it cannot see it.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Suppress positions worth less than this in USD. A wallet that has ever touched a vault keeps a rounding-dust position forever.","schema":{"default":0.01,"type":"number"}},{"name":"eventType","required":false,"in":"query","description":"Restrict to these event types.","schema":{"type":"array","items":{"type":"string","enum":["deposit","withdraw","borrow","repay","liquidation"]}}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds.","schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds.","schema":{"type":"number"}},{"name":"includeClosed","required":false,"in":"query","description":"Include vaults the wallet has fully exited. Defaults to true — a closed position is the part `positions` cannot show you.","schema":{"default":true,"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/borrow-positions/{address}":{"get":{"operationId":"YieldsPortfolioController_borrowPositions","summary":"List borrow positions","description":"Collateral and debt per market with LTV and health factor. The indexer models each side as its own row; they are re-joined here so a position is one object, not two halves.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id. Networks we do not index are reported in `errors.unsupportedNetworks` — a portfolio that silently omits a chain is worse than one that says it cannot see it.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Suppress positions worth less than this in USD. A wallet that has ever touched a vault keeps a rounding-dust position forever.","schema":{"default":0.01,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/total-returns/{address}/{network}/{vaultId}":{"get":{"operationId":"YieldsPortfolioController_totalReturns","summary":"Get total returns","description":"Current value plus everything withdrawn minus everything deposited, denominated in the vault asset — a USD figure would conflate yield with the asset's own price movement.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/events/{address}/{network}/{vaultId}":{"get":{"operationId":"YieldsPortfolioController_vaultEvents","summary":"List position events for one vault","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id. Networks we do not index are reported in `errors.unsupportedNetworks` — a portfolio that silently omits a chain is worse than one that says it cannot see it.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Suppress positions worth less than this in USD. A wallet that has ever touched a vault keeps a rounding-dust position forever.","schema":{"default":0.01,"type":"number"}},{"name":"eventType","required":false,"in":"query","description":"Restrict to these event types.","schema":{"type":"array","items":{"type":"string","enum":["deposit","withdraw","borrow","repay","liquidation"]}}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds.","schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds.","schema":{"type":"number"}},{"name":"includeClosed","required":false,"in":"query","description":"Include vaults the wallet has fully exited. Defaults to true — a closed position is the part `positions` cannot show you.","schema":{"default":true,"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/events/{address}":{"get":{"operationId":"YieldsPortfolioController_events","summary":"List wallet events","description":"Deposits, withdrawals, borrows, repayments and liquidations against this wallet, newest first. The existing /liquidations module is market-scoped and cannot answer \"what happened to me\".","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id. Networks we do not index are reported in `errors.unsupportedNetworks` — a portfolio that silently omits a chain is worse than one that says it cannot see it.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Suppress positions worth less than this in USD. A wallet that has ever touched a vault keeps a rounding-dust position forever.","schema":{"default":0.01,"type":"number"}},{"name":"eventType","required":false,"in":"query","description":"Restrict to these event types.","schema":{"type":"array","items":{"type":"string","enum":["deposit","withdraw","borrow","repay","liquidation"]}}},{"name":"fromTimestamp","required":false,"in":"query","description":"Start of the window, unix seconds.","schema":{"type":"number"}},{"name":"toTimestamp","required":false,"in":"query","description":"End of the window, unix seconds.","schema":{"type":"number"}},{"name":"includeClosed","required":false,"in":"query","description":"Include vaults the wallet has fully exited. Defaults to true — a closed position is the part `positions` cannot show you.","schema":{"default":true,"type":"boolean"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/positions/{address}/{network}/{vaultId}":{"get":{"operationId":"YieldsPortfolioController_position","summary":"Get one portfolio position","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/portfolio/positions/{address}":{"get":{"operationId":"YieldsPortfolioController_positions","summary":"List portfolio positions","description":"Vault positions across every indexed network, with current value and projected annual earnings.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"address","required":true,"in":"path","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number, 1-based.","schema":{"default":1,"type":"number"}},{"name":"perPage","required":false,"in":"query","description":"Items per page.","schema":{"maximum":500,"default":50,"type":"number"}},{"name":"allowedNetworks","required":false,"in":"query","description":"Networks to include, by slug or chain id. Networks we do not index are reported in `errors.unsupportedNetworks` — a portfolio that silently omits a chain is worse than one that says it cannot see it.","schema":{"type":"array","items":{"type":"string"}}},{"name":"allowedAssets","required":false,"in":"query","description":"Assets to include, by symbol or address.","schema":{"type":"array","items":{"type":"string"}}},{"name":"minUsdValueThreshold","required":false,"in":"query","description":"Suppress positions worth less than this in USD. A wallet that has ever touched a vault keeps a rounding-dust position forever.","schema":{"default":0.01,"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Yields · Portfolio"]}},"/v1/yields/realtime/{network}/{vaultId}/share-price":{"get":{"operationId":"YieldsRealtimeController_sharePrice","summary":"Read live share price","description":"Assets per share, read on-chain now. Null for a vault with no shares outstanding — never 1.0, which would be indistinguishable from a real reading.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","example":"plume","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","example":"0x1234abcd…","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Realtime"]}},"/v1/yields/realtime/{network}/{vaultId}/total-assets":{"get":{"operationId":"YieldsRealtimeController_totalAssets","summary":"Read live total assets","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Realtime"]}},"/v1/yields/realtime/{network}/{vaultId}/total-supply":{"get":{"operationId":"YieldsRealtimeController_totalSupply","summary":"Read live total share supply","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Realtime"]}},"/v1/yields/realtime/{network}/{vaultId}/underlying-asset-price":{"get":{"operationId":"YieldsRealtimeController_underlyingAssetPrice","summary":"Read the underlying asset price","description":"The asset identity is read on-chain; the PRICE comes from the same pricing layer the cached endpoints use, and the response says so via `priceSource`. Only vault state is live here.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Realtime"]}},"/v1/yields/realtime/{network}/{vaultId}":{"get":{"operationId":"YieldsRealtimeController_snapshot","summary":"Read all live vault state","description":"Total assets, total supply and share price from ONE block. Prefer this over polling the sub-resources: it is a single RPC round-trip, and separate calls can straddle a block and produce a share price that never existed.","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"network","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Yields · Realtime"]}},"/liquidations/eligible":{"get":{"operationId":"LiquidationsController_getEligibleLiquidations","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/recent-liquidations":{"get":{"operationId":"LiquidationsController_getRecentLiquidations","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/liquidations-overview":{"get":{"operationId":"LiquidationsController_getAllLiquidatedPositionsOverviewData","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"marketId","required":false,"in":"query","description":"Filter by market ID","example":"0x7489a392...","schema":{"type":"string"}},{"name":"userAddress","required":false,"in":"query","description":"Filter by user address","example":"0x7489a392...","schema":{"type":"string"}},{"name":"minBorrowSize","required":false,"in":"query","description":"Minimum borrow size in usd","example":2,"schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page Number","example":0,"schema":{"type":"number"}},{"name":"chainId","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/liquidations-data":{"get":{"operationId":"LiquidationsController_getAllLiquidationProcessedData","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"marketId","required":false,"in":"query","description":"Filter by market ID","example":"0x7489a392...","schema":{"type":"string"}},{"name":"userAddress","required":false,"in":"query","description":"Filter by user address","example":"0x7489a392...","schema":{"type":"string"}},{"name":"minBorrowSize","required":false,"in":"query","description":"Minimum borrow size in usd","example":2,"schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page Number","example":0,"schema":{"type":"number"}},{"name":"chainId","required":true,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/liquidateable-data":{"get":{"operationId":"LiquidationsController_getAllLiquidateableProcessedData","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/at-risk-users-data":{"get":{"operationId":"LiquidationsController_getAtRiskUsersProcessedData","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/overview-data":{"get":{"operationId":"LiquidationsController_getAllProcessedData","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"marketId","required":false,"in":"query","description":"Filter by market ID","example":"0x7489a392...","schema":{"type":"string"}},{"name":"minHealthFactor","required":false,"in":"query","description":"Minimum health factor","example":0.9,"schema":{"type":"number"}},{"name":"maxHealthFactor","required":false,"in":"query","description":"Maximum health factor","example":1.2,"schema":{"type":"number"}},{"name":"minBorrowSize","required":false,"in":"query","description":"Minimum borrow size in usd","example":2,"schema":{"type":"number"}},{"name":"userAddress","required":false,"in":"query","description":"Filter by user address","example":"0x7489a392...","schema":{"type":"string"}},{"name":"liquidatable","required":false,"in":"query","description":"Whether position is liquidatable","example":true,"schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","description":"Page Number","example":0,"schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Page size (default 10, max 100)","example":10,"schema":{"type":"number"}},{"name":"chainId","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/positions":{"get":{"operationId":"LiquidationsController_getAllPositionsData","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"marketId","required":false,"in":"query","description":"Filter by market ID","example":"0x7489a392...","schema":{"type":"string"}},{"name":"minHealthFactor","required":false,"in":"query","description":"Minimum health factor","example":0.9,"schema":{"type":"number"}},{"name":"maxHealthFactor","required":false,"in":"query","description":"Maximum health factor","example":1.2,"schema":{"type":"number"}},{"name":"minBorrowSize","required":false,"in":"query","description":"Minimum borrow size in usd","example":2,"schema":{"type":"number"}},{"name":"userAddress","required":false,"in":"query","description":"Filter by user address","example":"0x7489a392...","schema":{"type":"string"}},{"name":"liquidatable","required":false,"in":"query","description":"Whether position is liquidatable","example":true,"schema":{"type":"boolean"}},{"name":"page","required":false,"in":"query","description":"Page Number","example":0,"schema":{"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Page size (default 10, max 100)","example":10,"schema":{"type":"number"}},{"name":"chainId","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/liquidated-positions":{"get":{"operationId":"LiquidationsController_getAllLiquidatedPositionsData","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"marketId","required":false,"in":"query","description":"Filter by market ID","example":"0x7489a392...","schema":{"type":"string"}},{"name":"userAddress","required":false,"in":"query","description":"Filter by user address","example":"0x7489a392...","schema":{"type":"string"}},{"name":"minBorrowSize","required":false,"in":"query","description":"Minimum borrow size in usd","example":2,"schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page Number","example":0,"schema":{"type":"number"}},{"name":"chainId","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/summary":{"get":{"operationId":"LiquidationsController_getMorphoVaultsSummary","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/withdraws":{"get":{"operationId":"LiquidationsController_getMorphoVaultsWithdraws","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/liquidations/refresh-position":{"get":{"operationId":"LiquidationsController_refreshSinglePosition","parameters":[{"name":"x-api-key","in":"header","description":"API key. Required for non-UI callers once MORPHO_API_KEY_GUARD_ENABLED is on.","required":false,"schema":{"type":"string"}},{"name":"chainId","required":true,"in":"query","schema":{"type":"number"}},{"name":"positionId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Liquidations"]}},"/octarine/price/estimate":{"get":{"operationId":"OctarineController_getEstimatedPrice","summary":"Get estimated price for token pair","description":"Fetches oracle prices for both tokens and calculates the relative price. Returns output amount based on input.","parameters":[{"name":"chainId","required":true,"in":"query","description":"Chain ID","example":98866,"schema":{"type":"number"}},{"name":"redeemAsset","required":true,"in":"query","description":"Redeem token address (redeem asset)","schema":{"type":"string"}},{"name":"redemptionAsset","required":true,"in":"query","description":"Redemption token address (redemption asset)","schema":{"type":"string"}},{"name":"amount","required":false,"in":"query","description":"Amount of sell token in wei (optional, defaults to 1 unit)","schema":{"type":"string"}}],"responses":{"200":{"description":"Price estimation returned successfully"}},"tags":["Octarine"]}},"/octarine/fee/estimate":{"get":{"operationId":"OctarineController_getFeeEstimate","summary":"Get estimated fee for a trade","description":"Calculates the fee required for a specific trade amount based on the token and chain","parameters":[{"name":"chainId","required":true,"in":"query","description":"Chain ID","example":98866,"schema":{"type":"number"}},{"name":"redeemAsset","required":true,"in":"query","description":"Redeem token address (sell asset)","schema":{"type":"string"}},{"name":"redemptionAsset","required":true,"in":"query","description":"Redemption token address (buy asset)","schema":{"type":"string"}},{"name":"amount","required":true,"in":"query","description":"Amount of sell token in wei","schema":{"type":"string"}}],"responses":{"200":{"description":"Fee estimation returned successfully"}},"tags":["Octarine"]}},"/octarine/activity/{address}":{"get":{"operationId":"OctarineController_getUserActivity","summary":"Get user trading activity","description":"Returns trading volume, trade count, unique tokens traded, and paginated transaction history for a user","parameters":[{"name":"address","required":true,"in":"path","description":"User wallet address","schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Chain ID (optional, for multi-chain)","schema":{"type":"number"}},{"name":"type","required":false,"in":"query","description":"Transaction type filter","schema":{"default":"all","enum":["swap","approve","all"],"type":"string"}},{"name":"timeRange","required":false,"in":"query","description":"Time range filter","schema":{"default":"all_time","enum":["all_time","last_day","last_week","last_month","last_year"],"type":"string"}},{"name":"page","required":true,"in":"query","description":"Page number","schema":{"default":1,"type":"number"}},{"name":"limit","required":true,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"fullAuctionEnabled","required":false,"in":"query","description":"When true, restrict to requests created via the \"Create Auction\" flow. Only honoured on the /orders endpoint (scope=\"orders\") — /activity ignores it.","schema":{"type":"boolean"}},{"name":"status","required":false,"in":"query","description":"Filter by request status, e.g. \"bidding\" or \"filled,expired\". Only honoured on /orders — /activity is defined as the completed-trades view and stays pinned to \"filled\". Unknown values are rejected rather than quietly returning nothing. Takes precedence over `open`.","schema":{"type":"string"}},{"name":"open","required":false,"in":"query","description":"Shorthand for the statuses a user can still act on: pending + bidding, and only while the request has not passed its on-chain expiry. Ignored when `status` is given, and only honoured on /orders.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"User activity retrieved successfully"}},"tags":["Octarine"]}},"/octarine/orders/{address}":{"get":{"operationId":"OctarineController_getUserOrders","summary":"Get the user's auction orders (Auctions tab)","description":"Every request this address is party to — placed by it, or won by it as a market maker — in any status (pending, bidding, filled, expired), with the best active bid embedded per non-filled row. Narrow with `status` (comma-separated), or with `open=true` for just the ones the user can still act on.","parameters":[{"name":"address","required":true,"in":"path","description":"User wallet address","schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Chain ID (optional, for multi-chain)","schema":{"type":"number"}},{"name":"type","required":false,"in":"query","description":"Transaction type filter","schema":{"default":"all","enum":["swap","approve","all"],"type":"string"}},{"name":"timeRange","required":false,"in":"query","description":"Time range filter","schema":{"default":"all_time","enum":["all_time","last_day","last_week","last_month","last_year"],"type":"string"}},{"name":"page","required":true,"in":"query","description":"Page number","schema":{"default":1,"type":"number"}},{"name":"limit","required":true,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"fullAuctionEnabled","required":false,"in":"query","description":"When true, restrict to requests created via the \"Create Auction\" flow. Only honoured on the /orders endpoint (scope=\"orders\") — /activity ignores it.","schema":{"type":"boolean"}},{"name":"status","required":false,"in":"query","description":"Filter by request status, e.g. \"bidding\" or \"filled,expired\". Only honoured on /orders — /activity is defined as the completed-trades view and stays pinned to \"filled\". Unknown values are rejected rather than quietly returning nothing. Takes precedence over `open`.","schema":{"type":"string"}},{"name":"open","required":false,"in":"query","description":"Shorthand for the statuses a user can still act on: pending + bidding, and only while the request has not passed its on-chain expiry. Ignored when `status` is given, and only honoured on /orders.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"User orders retrieved successfully"}},"tags":["Octarine"]}},"/octarine/chains":{"get":{"operationId":"OctarineController_getSupportedChains","summary":"Get supported chains","description":"Returns list of blockchain networks supported by the orderbook system","parameters":[],"responses":{"200":{"description":"Supported chains retrieved successfully"}},"tags":["Octarine"]}},"/octarine/swap":{"post":{"operationId":"OctarineController_getSwapQuote","summary":"Get a swap quote (Instant or RFQ)","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSwapRequestDto"}}}},"responses":{"201":{"description":"Quote returned or RFQ created"}},"tags":["Octarine"]}},"/octarine/swap/{requestId}":{"get":{"operationId":"OctarineController_getSwapStatus","summary":"Get swap status and best bids","parameters":[{"name":"requestId","required":true,"in":"path","description":"RFQ request ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Status and bids returned"}},"tags":["Octarine"]}},"/octarine/request/{requestId}":{"get":{"operationId":"OctarineController_getSwapRequestById","summary":"Get a single RFQ request","parameters":[{"name":"requestId","required":true,"in":"path","description":"RFQ request ID","schema":{"type":"string"}}],"responses":{"200":{"description":"RFQ request returned"},"404":{"description":"Request not found"}},"tags":["Octarine"]},"delete":{"operationId":"OctarineController_cancelRFQRequest","summary":"Cancel RFQ request","description":"Cancel an active RFQ request. Gated by CancelRfqOriginGuard — see CANCEL_RFQ_ALLOWED_ORIGINS env var; empty/unset = denied.","parameters":[{"name":"requestId","required":true,"in":"path","description":"RFQ request ID","schema":{"type":"string"}}],"responses":{"200":{"description":"RFQ request cancelled successfully"}},"tags":["Octarine"]}},"/octarine/requests":{"get":{"operationId":"OctarineController_getSwapRequests","summary":"List RFQ requests","description":"Get list of RFQ requests with optional filters","parameters":[{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Filter by chain ID. Accepts a single id (e.g. \"98866\") or a comma-separated list to match multiple chains (e.g. \"98866,1\").","schema":{"type":"string"}},{"name":"user","required":false,"in":"query","description":"Filter by user address","schema":{"type":"string"}},{"name":"marketMaker","required":false,"in":"query","description":"Market maker address to view the list AS. Hides nothing, each row gains `hasBid`, `myBidCount`, `myBestBidAmount` and `outbid` for this maker, so a bidding bot can see when it has been topped and re-bid. Pair with `excludeBidOn=true` for the old \"only requests I have never bid on\" queue.","schema":{"type":"string"}},{"name":"excludeBidOn","required":false,"in":"query","description":"Requires `marketMaker`. Drops every request that maker has ever bid on, in any bid state. Off by default: it also hides auctions where the maker was outbid, which is exactly where it would want to bid again.","schema":{"default":false,"type":"boolean"}},{"name":"page","required":true,"in":"query","description":"Page number","schema":{"default":1,"type":"number"}},{"name":"limit","required":true,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"minAmount","required":false,"in":"query","description":"Minimum amount","schema":{"type":"string"}},{"name":"maxAmount","required":false,"in":"query","description":"Maximum amount","schema":{"type":"string"}},{"name":"maxRedemptionTime","required":false,"in":"query","description":"Maximum redemption time","schema":{"type":"string"}},{"name":"minRiskRating","required":false,"in":"query","description":"Minimum risk rating","schema":{"enum":["AAA","AA","A","BBB","BB","B","CCC","CC","C","D"],"type":"string"}},{"name":"makerToken","required":false,"in":"query","description":"Maker token address","schema":{"type":"string"}},{"name":"takerToken","required":false,"in":"query","description":"Taker token address","schema":{"type":"string"}},{"name":"timeRange","required":false,"in":"query","description":"Filter by createdAt time range","schema":{"enum":["all_time","last_day","last_week","last_month","last_year"],"type":"string"}},{"name":"fullAuctionEnabled","required":false,"in":"query","description":"When true, restrict to requests created via the \"Create Auction\" flow (FalconX tranches, nTBill, etc.). Defaults to \"any\" when omitted.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"RFQ requests retrieved successfully"}},"tags":["Octarine"]}},"/octarine/swaps/opportunities":{"get":{"operationId":"OctarineController_getSwapOpportunities","summary":"List RFQ opportunities","description":"Get list of RFQ opportunities with optional filters","parameters":[{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Filter by chain ID. Accepts a single id (e.g. \"98866\") or a comma-separated list to match multiple chains (e.g. \"98866,1\").","schema":{"type":"string"}},{"name":"user","required":false,"in":"query","description":"Filter by user address","schema":{"type":"string"}},{"name":"marketMaker","required":false,"in":"query","description":"Market maker address to view the list AS. Hides nothing, each row gains `hasBid`, `myBidCount`, `myBestBidAmount` and `outbid` for this maker, so a bidding bot can see when it has been topped and re-bid. Pair with `excludeBidOn=true` for the old \"only requests I have never bid on\" queue.","schema":{"type":"string"}},{"name":"excludeBidOn","required":false,"in":"query","description":"Requires `marketMaker`. Drops every request that maker has ever bid on, in any bid state. Off by default: it also hides auctions where the maker was outbid, which is exactly where it would want to bid again.","schema":{"default":false,"type":"boolean"}},{"name":"page","required":true,"in":"query","description":"Page number","schema":{"default":1,"type":"number"}},{"name":"limit","required":true,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"minAmount","required":false,"in":"query","description":"Minimum amount","schema":{"type":"string"}},{"name":"maxAmount","required":false,"in":"query","description":"Maximum amount","schema":{"type":"string"}},{"name":"maxRedemptionTime","required":false,"in":"query","description":"Maximum redemption time","schema":{"type":"string"}},{"name":"minRiskRating","required":false,"in":"query","description":"Minimum risk rating","schema":{"enum":["AAA","AA","A","BBB","BB","B","CCC","CC","C","D"],"type":"string"}},{"name":"makerToken","required":false,"in":"query","description":"Maker token address","schema":{"type":"string"}},{"name":"takerToken","required":false,"in":"query","description":"Taker token address","schema":{"type":"string"}},{"name":"timeRange","required":false,"in":"query","description":"Filter by createdAt time range","schema":{"enum":["all_time","last_day","last_week","last_month","last_year"],"type":"string"}},{"name":"fullAuctionEnabled","required":false,"in":"query","description":"When true, restrict to requests created via the \"Create Auction\" flow (FalconX tranches, nTBill, etc.). Defaults to \"any\" when omitted.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"RFQ requests retrieved successfully"}},"tags":["Octarine"]}},"/octarine/summary":{"get":{"operationId":"OctarineController_getRequestsSummary","summary":"Get Octarine requests summary","description":"Get aggregated statistics and summary of RFQ requests with optional filters","parameters":[{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Filter by chain ID. Accepts a single id (e.g. \"98866\") or a comma-separated list to match multiple chains (e.g. \"98866,1\").","schema":{"type":"string"}},{"name":"user","required":false,"in":"query","description":"Filter by user address","schema":{"type":"string"}},{"name":"marketMaker","required":false,"in":"query","description":"Market maker address to view the list AS. Hides nothing, each row gains `hasBid`, `myBidCount`, `myBestBidAmount` and `outbid` for this maker, so a bidding bot can see when it has been topped and re-bid. Pair with `excludeBidOn=true` for the old \"only requests I have never bid on\" queue.","schema":{"type":"string"}},{"name":"excludeBidOn","required":false,"in":"query","description":"Requires `marketMaker`. Drops every request that maker has ever bid on, in any bid state. Off by default: it also hides auctions where the maker was outbid, which is exactly where it would want to bid again.","schema":{"default":false,"type":"boolean"}},{"name":"page","required":true,"in":"query","description":"Page number","schema":{"default":1,"type":"number"}},{"name":"limit","required":true,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"minAmount","required":false,"in":"query","description":"Minimum amount","schema":{"type":"string"}},{"name":"maxAmount","required":false,"in":"query","description":"Maximum amount","schema":{"type":"string"}},{"name":"maxRedemptionTime","required":false,"in":"query","description":"Maximum redemption time","schema":{"type":"string"}},{"name":"minRiskRating","required":false,"in":"query","description":"Minimum risk rating","schema":{"enum":["AAA","AA","A","BBB","BB","B","CCC","CC","C","D"],"type":"string"}},{"name":"makerToken","required":false,"in":"query","description":"Maker token address","schema":{"type":"string"}},{"name":"takerToken","required":false,"in":"query","description":"Taker token address","schema":{"type":"string"}},{"name":"timeRange","required":false,"in":"query","description":"Filter by createdAt time range","schema":{"enum":["all_time","last_day","last_week","last_month","last_year"],"type":"string"}},{"name":"fullAuctionEnabled","required":false,"in":"query","description":"When true, restrict to requests created via the \"Create Auction\" flow (FalconX tranches, nTBill, etc.). Defaults to \"any\" when omitted.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"RFQ requests summary retrieved successfully"}},"tags":["Octarine"]}},"/octarine/fill":{"post":{"operationId":"OctarineController_recordSwapFill","summary":"Record a filled swap","parameters":[],"responses":{"201":{"description":"Fill recorded"}},"tags":["Octarine"]}},"/octarine/transform":{"post":{"operationId":"OctarineController_transform","summary":"Execute post-fill transformation","description":"Execute the remaining transactions (collateral transfer, redemption) after a fill","parameters":[],"responses":{"201":{"description":"Transformation executing"}},"tags":["Octarine"]}},"/octarine/approval":{"post":{"operationId":"OctarineController_recordApproval","summary":"Record an approval transaction","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordApprovalDto"}}}},"responses":{"201":{"description":"Approval recorded"}},"tags":["Octarine"]}},"/octarine/bid":{"post":{"operationId":"OctarineController_submitBid","summary":"Submit bid","description":"Market maker submits bid on RFQ request or liquidation with permit signature","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBidDto"}}}},"responses":{"201":{"description":"Bid submitted successfully"},"400":{"description":"Invalid bid data"}},"tags":["Octarine"]}},"/octarine/swap/{requestId}/accept-delayed":{"post":{"operationId":"OctarineController_acceptDelayedBid","summary":"Accept a delayed settlement bid","description":"User accepts a delayed bid, moving the swap status to Solving (auction closed, bid locked). The settlement watcher monitors the user wallet balance and triggers the fill when funded.","parameters":[{"name":"requestId","required":true,"in":"path","description":"RFQ request ID","schema":{"type":"string"}}],"responses":{"201":{"description":"Delayed bid accepted, swap moved to Solving"},"400":{"description":"Invalid request or bid"}},"tags":["Octarine"]}},"/octarine/request/{requestId}/bids":{"get":{"operationId":"OctarineController_getBidsForRequest","summary":"Get bids for request","description":"Retrieve all bids submitted for a specific RFQ request with pagination","parameters":[{"name":"requestId","required":true,"in":"path","description":"RFQ request ID","schema":{"type":"string"}},{"name":"marketMaker","required":false,"in":"query","description":"Filter by market maker","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter by bid status","schema":{"enum":["pending","accepted","rejected","expired","cancelled"],"type":"string"}},{"name":"timeRange","required":false,"in":"query","description":"Filter by createdAt time range","schema":{"enum":["all_time","last_day","last_week","last_month","last_year"],"type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Filter by chain id (joined via request)","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number","example":1,"schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","example":20,"schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"Bids retrieved successfully"}},"tags":["Octarine"]}},"/octarine/market-maker/{marketMaker}/bids":{"get":{"operationId":"OctarineController_getBidsByMarketMaker","summary":"Get bids for market maker","description":"Retrieve all bids submitted by a specific market maker with pagination","parameters":[{"name":"marketMaker","required":true,"in":"path","description":"Market maker address","schema":{"type":"string"}},{"name":"requestId","required":false,"in":"query","description":"Filter by request ID","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"enum":["pending","accepted","rejected","expired","cancelled"],"type":"string"}},{"name":"timeRange","required":false,"in":"query","description":"Filter by createdAt time range","schema":{"enum":["all_time","last_day","last_week","last_month","last_year"],"type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Filter by chain id (joined via request)","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number","example":1,"schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","example":50,"schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"Bids retrieved successfully"}},"tags":["Octarine"]}},"/octarine/bid/{bidId}":{"get":{"operationId":"OctarineController_getBid","summary":"Get bid by ID","description":"Retrieve details of a specific bid","parameters":[{"name":"bidId","required":true,"in":"path","description":"Bid ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Bid retrieved successfully"},"404":{"description":"Bid not found"}},"tags":["Octarine"]},"delete":{"operationId":"OctarineController_cancelBid","summary":"Cancel bid","description":"Market maker cancels their own bid","parameters":[{"name":"bidId","required":true,"in":"path","description":"Bid ID","schema":{"type":"string"}},{"name":"marketMaker","required":true,"in":"query","description":"Market maker address","schema":{"type":"string"}}],"responses":{"200":{"description":"Bid cancelled successfully"}},"tags":["Octarine"]}},"/octarine/standing-orders/initiate":{"post":{"operationId":"OctarineController_initiateStandingOrder","summary":"Initiate standing order","description":"Market maker initiates a standing order with NAV-based pricing. Returns an RFQ order to sign. The price is calculated from the current NAV using the configured oracle and the MM's spread.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateStandingOrderDto"}}}},"responses":{"201":{"description":"Standing order initiated, RFQ order ready to sign"}},"tags":["Octarine"]}},"/octarine/standing-orders/submit":{"post":{"operationId":"OctarineController_submitStandingOrder","summary":"Submit standing order signature","description":"Submit the signed RFQ order to activate the standing order. Use the standing order ID from the initiate step.","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitStandingOrderDto"}}}},"responses":{"200":{"description":"Standing order activated successfully"}},"tags":["Octarine"]}},"/octarine/standing-orders/{standingOrderId}/record-deposit":{"post":{"operationId":"OctarineController_recordStandingOrderDeposit","summary":"Record standing-order deposit txn hash","description":"After broadcasting the funding txns returned by initiate (but before submit), the MM reports the deposit txn hash here. This lets a failed submit be recovered on retry without depositing twice — a re-initiate reuses this order instead of asking for a new deposit.","parameters":[{"name":"standingOrderId","required":true,"in":"path","description":"Standing order ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecordStandingOrderDepositDto"}}}},"responses":{"200":{"description":"Deposit recorded successfully"}},"tags":["Octarine"]}},"/octarine/standing-orders/{standingOrderId}/close":{"post":{"operationId":"OctarineController_closeStandingOrder","summary":"Close a yield-routed standing order","description":"Deactivates the SO and returns an unsigned Safe txn that redeems its remaining vault shares (principal + accrued yield) back to the MM wallet. Returns data:null for non-yield-routed or already-empty SOs. Broadcast the returned txn to recover funds.","parameters":[{"name":"standingOrderId","required":true,"in":"path","description":"Standing order ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloseStandingOrderDto"}}}},"responses":{"200":{"description":"Close txn built (or null when nothing to redeem)"}},"tags":["Octarine"]}},"/octarine/standing-orders/{standingOrderId}/migrate-vault":{"post":{"operationId":"OctarineController_migrateStandingOrderVault","summary":"Migrate a standing order to a different Morpho vault","description":"Pauses the SO and returns an unsigned Safe txn that atomically redeems its shares from the current vault and deposits the freed assets into the chosen curated vault. Re-activate the SO (PATCH isActive=true) once the txn confirms.","parameters":[{"name":"standingOrderId","required":true,"in":"path","description":"Standing order ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrateStandingOrderVaultDto"}}}},"responses":{"200":{"description":"Vault-migration txn built"}},"tags":["Octarine"]}},"/octarine/standing-orders/pair":{"get":{"operationId":"OctarineController_getStandingOrdersForPair","summary":"Get standing orders for token pair","description":"Get active standing orders for a token pair, ranked by best price","parameters":[{"name":"makerToken","required":true,"in":"query","description":"Maker token address","schema":{"type":"string"}},{"name":"takerToken","required":true,"in":"query","description":"Taker token address","schema":{"type":"string"}},{"name":"chainId","required":true,"in":"query","description":"Chain ID","schema":{"type":"number"}},{"name":"limit","required":true,"in":"query","description":"Max results","schema":{"default":10,"type":"number"}}],"responses":{"200":{"description":"Standing orders retrieved successfully"}},"tags":["Octarine"]}},"/octarine/standing-orders/{standingOrderId}":{"get":{"operationId":"OctarineController_getStandingOrderById","summary":"Get standing order by ID","description":"Retrieve details of a specific standing order","parameters":[{"name":"standingOrderId","required":true,"in":"path","description":"Standing order ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Standing order retrieved successfully"}},"tags":["Octarine"]},"patch":{"operationId":"OctarineController_updateStandingOrder","summary":"Update standing order","description":"Update standing order parameters (spread, max liquidity, active status)","parameters":[{"name":"standingOrderId","required":true,"in":"path","description":"Standing order ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateStandingOrderDto"}}}},"responses":{"200":{"description":"Standing order updated successfully"}},"tags":["Octarine"]},"delete":{"operationId":"OctarineController_cancelStandingOrder","summary":"Cancel standing order","description":"Market maker cancels their own standing order","parameters":[{"name":"standingOrderId","required":true,"in":"path","description":"Standing order ID","schema":{"type":"string"}},{"name":"marketMaker","required":true,"in":"query","description":"Market maker address","schema":{"type":"string"}}],"responses":{"200":{"description":"Standing order cancelled successfully"}},"tags":["Octarine"]}},"/octarine/standing-orders/market-maker/{marketMaker}":{"get":{"operationId":"OctarineController_getMarketMakerStandingOrders","summary":"Get market maker standing orders","description":"Get all standing orders for a specific market maker","parameters":[{"name":"marketMaker","required":true,"in":"path","description":"Market maker address","schema":{"type":"string"}},{"name":"onlyActive","required":false,"in":"query","description":"Only return active standing orders","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Standing orders retrieved successfully"}},"tags":["Octarine"]}},"/octarine/standing-orders/{standingOrderId}/pending-swaps":{"get":{"operationId":"OctarineController_getStandingOrderPendingSwaps","summary":"Get a standing order's pending swaps","description":"Swaps won by the standing order (accepted bids) whose parent request is not yet settled, with summed maker/taker amounts","parameters":[{"name":"standingOrderId","required":true,"in":"path","description":"Standing order ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Pending swaps retrieved successfully"}},"tags":["Octarine"]}},"/octarine/liquidations/opportunities":{"get":{"operationId":"OctarineController_getLiquidationOpportunities","summary":"Get liquidation opportunities","description":"Fetch underwater positions from Morpho that can be liquidated","parameters":[{"name":"chainId","required":false,"in":"query","description":"Chain ID","schema":{"type":"number"}},{"name":"maxHealthFactor","required":true,"in":"query","description":"Minimum health factor (positions below this)","schema":{"default":1,"type":"number"}},{"name":"minValueUSD","required":true,"in":"query","description":"Minimum position value in USD","schema":{"default":0,"type":"number"}},{"name":"maxValueUSD","required":false,"in":"query","description":"Maximum position value in USD","schema":{"type":"number"}},{"name":"page","required":true,"in":"query","description":"Page number","schema":{"default":1,"type":"number"}},{"name":"limit","required":true,"in":"query","description":"Items per page","schema":{"default":20,"type":"number"}},{"name":"marketIds","required":false,"in":"query","description":"Market IDs","schema":{"type":"array","items":{"type":"string"}}},{"name":"collateralAssets","required":false,"in":"query","description":"Collateral Assets","schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"Liquidation opportunities retrieved"}},"tags":["Octarine"]}},"/octarine/liquidations/bid":{"post":{"operationId":"OctarineController_submitLiquidationBid","summary":"Submit bid for manual liquidation or swap","description":"Market maker submits a bid on RFQ request or liquidation with permit signature","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitLiquidationBidDto"}}}},"responses":{"201":{"description":"Bid submitted successfully"},"400":{"description":"Invalid bid data"}},"tags":["Octarine"]}},"/octarine/liquidations/{liquidationId}":{"get":{"operationId":"OctarineController_getLiquidation","summary":"Get liquidation details","description":"Retrieve details of a specific liquidation","parameters":[{"name":"liquidationId","required":true,"in":"path","description":"Liquidation ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Liquidation details retrieved"}},"tags":["Octarine"]}},"/octarine/liquidations/{liquidationId}/simulate-soft":{"get":{"operationId":"OctarineController_simulateSoftLiquidation","summary":"Simulate soft liquidation","description":"Test soft liquidation calculation for a position - returns maxRepay and simulated bid without submitting","parameters":[{"name":"liquidationId","required":true,"in":"path","description":"Liquidation ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Soft liquidation simulation returned"}},"tags":["Octarine"]}},"/octarine/liquidations/{liquidationId}/bids":{"get":{"operationId":"OctarineController_getLiquidationBids","summary":"Get bids for liquidation","description":"Retrieve all bids submitted for a specific liquidation with pagination and statistics","parameters":[{"name":"liquidationId","required":true,"in":"path","description":"Liquidation ID","schema":{"type":"string"}},{"name":"requestId","required":false,"in":"query","description":"Filter by request ID","schema":{"type":"string"}},{"name":"marketMaker","required":false,"in":"query","description":"Filter by market maker","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"enum":["pending","accepted","rejected","expired","cancelled"],"type":"string"}},{"name":"timeRange","required":false,"in":"query","description":"Filter by createdAt time range","schema":{"enum":["all_time","last_day","last_week","last_month","last_year"],"type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Filter by chain id (joined via request)","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number","example":1,"schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","example":20,"schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"Bids retrieved successfully with statistics"}},"tags":["Octarine"]}},"/octarine/market-maker/{marketMaker}/liquidation-bids":{"get":{"operationId":"OctarineController_getLiquidationBidsByMarketMaker","summary":"Get liquidation bids for market maker","description":"Retrieve all bids submitted by a specific market maker with pagination","parameters":[{"name":"marketMaker","required":true,"in":"path","description":"Market maker address","schema":{"type":"string"}},{"name":"requestId","required":false,"in":"query","description":"Filter by request ID","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter by status","schema":{"enum":["pending","accepted","rejected","expired","cancelled"],"type":"string"}},{"name":"timeRange","required":false,"in":"query","description":"Filter by createdAt time range","schema":{"enum":["all_time","last_day","last_week","last_month","last_year"],"type":"string"}},{"name":"chainId","required":false,"in":"query","description":"Filter by chain id (joined via request)","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"Page number","example":1,"schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page","example":50,"schema":{"default":20,"type":"number"}}],"responses":{"200":{"description":"Bids retrieved successfully"}},"tags":["Octarine"]}},"/octarine/liquidations":{"get":{"operationId":"OctarineController_getLiquidations","summary":"Get liquidations","description":"Get list of liquidatable positions","parameters":[{"name":"limit","required":false,"in":"query","description":"Limit","schema":{"type":"number"}},{"name":"chainId","required":false,"in":"query","description":"Chain ID","schema":{"type":"number"}}],"responses":{"200":{"description":"Liquidations retrieved"}},"tags":["Octarine"]}},"/octarine/liquidations/history":{"get":{"operationId":"OctarineController_getLiquidatedPositions","summary":"Get liquidated positions history","description":"Get history of executed liquidations","parameters":[{"name":"chainId","required":false,"in":"query","description":"Chain ID","schema":{"type":"number"}},{"name":"positionId","required":false,"in":"query","description":"Filter by position/liquidation ID","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Limit","schema":{"type":"number"}}],"responses":{"200":{"description":"Liquidated positions retrieved"}},"tags":["Octarine"]}},"/octarine/claim":{"post":{"operationId":"OctarineController_claimVaultMarket","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClaimVaultMarketDto"}}}},"responses":{"201":{"description":""}},"tags":["Octarine"]}},"/octarine/{chainId}/{vaultAddress}/{marketId}":{"get":{"operationId":"OctarineController_getConfig","parameters":[{"name":"chainId","required":true,"in":"path","schema":{"type":"string"}},{"name":"vaultAddress","required":true,"in":"path","schema":{"type":"string"}},{"name":"marketId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Octarine"]}},"/octarine/telegram/mystic-webhook":{"post":{"operationId":"OctarineController_mysticTelegramWebhook","summary":"Mystic Telegram bot webhook","description":"Receives updates from the Mystic bot. `/start apikey-<source>` stores an API key request and confirms receipt to the user. The key itself is DM'd later, when one is attached to their row.","parameters":[],"responses":{"200":{"description":"Update acknowledged."}},"tags":["Octarine"]}},"/octarine/telegram/webhook":{"post":{"operationId":"OctarineController_telegramWebhook","summary":"Telegram bot webhook","description":"Receives updates from the Telegram bot. On `/start <walletAddress>` we persist the chat_id → wallet mapping so the user can be DM'd when bids arrive on any auction they own. Always returns 200 so Telegram doesn't retry; errors are logged.","parameters":[],"responses":{"200":{"description":"Update acknowledged."}},"tags":["Octarine"]}}},"info":{"title":"Mystic Finance API","description":"Mystic Finance Backend API","version":"1.0","contact":{}},"tags":[{"name":"Yields","description":"Vault discovery. The current public API — see docs/yields-api.md."},{"name":"Yields · Borrow","description":"Lending markets, framed for borrowing."},{"name":"Yields · Historical","description":"Time series: TVL, APY, share price, asset price."},{"name":"Yields · Portfolio","description":"Wallet-scoped positions, events, returns and recommendations."},{"name":"Yields · Reference","description":"Networks, assets, protocols, curators, tags, health. Free to call."},{"name":"Yields · Realtime","description":"Uncached on-chain reads. Priced highest — one RPC round-trip per call."},{"name":"MorphoCache","description":"LEGACY. Superseded by /v1/yields. Still supported; new integrations should start on the Yields tags above."},{"name":"MorphoCache Admin","description":""},{"name":"Octarine","description":""},{"name":"Liquidations","description":""}],"servers":[{"url":"https://api.mysticfinance.xyz","description":"Production"},{"url":"https://staging-api.mysticfinance.xyz","description":"Staging"},{"url":"https://curator-api.mysticfinance.xyz","description":"Curator"}],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"}},"schemas":{"CreateTokenDto":{"type":"object","properties":{}},"OrderMetadata":{"type":"object","properties":{}},"OrderWithCounter":{"type":"object","properties":{}},"CreateOrderDto":{"type":"object","properties":{"chainId":{"type":"number","description":"Chain ID of the order"},"exchangeContractAddress":{"type":"string","description":"Address of the exchange contract","default":"0xdef1c0ded9bec7f1a1670819833240f027b25eff"},"orderMetadata":{"description":"Order metadata (assets metadata, implementation, transactionHash, order counter, etc) object","allOf":[{"$ref":"#/components/schemas/OrderMetadata"}]},"orderWithCounter":{"description":"Order with counter","allOf":[{"$ref":"#/components/schemas/OrderWithCounter"}]}},"required":["chainId","exchangeContractAddress","orderMetadata","orderWithCounter"]},"FulfillBody":{"type":"object","properties":{"takerAddress":{"type":"string","description":"Taker address"},"transactionHash":{"type":"string","description":"Transaction hash of the completed swap."}},"required":["takerAddress","transactionHash"]},"CancelBody":{"type":"object","properties":{"transactionHash":{"type":"string","description":"Hash of the cancellation"}},"required":["transactionHash"]},"GetNftDetailsDto":{"type":"object","properties":{"address":{"type":"string"},"tokenId":{"type":"string"},"accountAddress":{"type":"string"}},"required":["address","tokenId","accountAddress"]},"Message":{"type":"object","properties":{}},"Hero":{"type":"object","properties":{}},"CreateWhitelist":{"type":"object","properties":{"walletAddress":{"type":"string","description":"Wallet Address of the User"},"whiteList":{"type":"boolean","description":"Whitelist of the user","default":true},"startDate":{"format":"date-time","type":"string","description":"Start Date of the whitelist"},"duration":{"format":"date-time","type":"string","description":"Duration of the whitelist"},"mystFee":{"type":"number","description":"Fee to be in number or as a percentage"},"feeType":{"type":"string","description":"The feeType which can be either percentage or number","default":"number"}},"required":["walletAddress","whiteList","startDate","duration","mystFee","feeType"]},"UpdateWhitelist":{"type":"object","properties":{}},"IdsArrayDto":{"type":"object","properties":{}},"CreateSettings":{"type":"object","properties":{"key":{"type":"string","description":"key of the setting"},"value":{"type":"string","description":"value of the setting"}},"required":["key","value"]},"UpdateSettings":{"type":"object","properties":{}},"CreateRole":{"type":"object","properties":{"walletAddress":{"type":"string","description":"Wallet Address of the User"},"role":{"type":"string","description":"Role of the User"}},"required":["walletAddress","role"]},"UpdateRole":{"type":"object","properties":{}},"CreateSwaptype":{"type":"object","properties":{"swap":{"type":"string","description":"Swap Type"}},"required":["swap"]},"UpdateSwaptype":{"type":"object","properties":{}},"getFee":{"type":"object","properties":{"swapId":{"type":"string","description":"Id of the Swap"},"walletAddress":{"type":"string","description":"Wallet Address"},"collectionAddresses":{"description":"Collection Address","type":"array","items":{"type":"string"}}},"required":["swapId","walletAddress","collectionAddresses"]},"AddErc20Dto":{"type":"object","properties":{}},"Erc20":{"type":"object","properties":{}},"CreateDynamic":{"type":"object","properties":{"walletAddress":{"type":"string","description":"Wallet Address"},"unwantedCollectionAddresses":{"description":"Array of Collection Addresses","type":"array","items":{"type":"string"}},"wantedCollectionAddresses":{"description":"Array of Collection Addresses","type":"array","items":{"type":"string"}},"nftIds":{"description":"Array of Collection Addresses","type":"array","items":{"type":"string"}},"email":{"type":"string","description":"E-mail"},"phoneNumber":{"type":"string","description":"Phone Number"},"telegram":{"type":"string","description":"Telegram"}},"required":["walletAddress","unwantedCollectionAddresses","wantedCollectionAddresses","nftIds","email","phoneNumber","telegram"]},"UpdateDynamic":{"type":"object","properties":{}},"TrackTransactionDTO":{"type":"object","properties":{"userAddress":{"type":"string","description":"Transaction maker address"},"tokenAmount":{"type":"number","description":"Token amount"},"tokenAmountInUsd":{"type":"number","description":"Transaction value in USD"},"transactionType":{"type":"string","description":"Transaction type"},"chainId":{"type":"number","description":"Chain ID"},"token":{"type":"string","description":"Token used in transaction"},"tokenAddress":{"type":"string","description":"Token address"},"collateralAddress":{"type":"string","description":"Collateral address on borrow"},"vaultOrMarketID":{"type":"string","description":"Vault address or market ID"},"txHash":{"type":"string","description":"Transaction hash"},"pointsBoost":{"type":"number","description":"Points multiplier boost"}},"required":["userAddress","tokenAmount","tokenAmountInUsd","transactionType","chainId","token","tokenAddress","txHash","pointsBoost"]},"TrackOctarineEventDTO":{"type":"object","properties":{"userAddress":{"type":"string","description":"Wallet that performed the action (swapper or MM)"},"eventType":{"type":"string","description":"Event type: 'swap' | 'auction_created' | 'auction_accepted' | 'bid_placed' | 'standing_bid'"},"chainId":{"type":"number","description":"Chain ID"},"actor":{"type":"string","description":"'user' | 'market_maker'"},"sellToken":{"type":"string","description":"Sell/redeem token symbol"},"sellTokenAddress":{"type":"string","description":"Sell/redeem token address"},"sellTokenLogo":{"type":"string","description":"Sell/redeem token logo URI"},"sellAmount":{"type":"number","description":"Sell amount (human units)"},"sellAmountUsd":{"type":"number","description":"Sell amount in USD"},"buyToken":{"type":"string","description":"Buy/redemption token symbol"},"buyTokenAddress":{"type":"string","description":"Buy/redemption token address"},"buyTokenLogo":{"type":"string","description":"Buy/redemption token logo URI"},"buyAmount":{"type":"number","description":"Buy amount (human units)"},"buyAmountUsd":{"type":"number","description":"Buy amount in USD"},"requestId":{"type":"string","description":"Auction / RFQ request id"},"bidId":{"type":"string","description":"Bid id (bid_placed / auction_accepted)"},"spread":{"type":"number","description":"MM bid spread (%)"},"txHash":{"type":"string","description":"On-chain tx hash for settled actions"},"durationSeconds":{"type":"number","description":"How long the action stays live, in seconds: auction / standing-bid validity window, or an MM bid expiry."}},"required":["userAddress","eventType","chainId"]},"CreateClient":{"type":"object","properties":{"username":{"type":"string","description":"Username"},"password":{"type":"string","description":"Password"},"email":{"type":"string","description":"Email"}},"required":["username","password","email"]},"UpdateClient":{"type":"object","properties":{}},"ItemDto":{"type":"object","properties":{"itemtype":{"type":"string","example":"NATIVE","enum":["NATIVE","ERC20","ERC721","ERC1155","ERC721_WITH_CRITERIA","ERC1155_WITH_CRITERIA"]},"token":{"type":"string","example":"0x123456789abcdef123456789abcdef123456789a"},"identifier":{"type":"string","example":"unique_identifier"},"amount":{"type":"string","example":"10"}},"required":["itemtype","token","identifier","amount"]},"CreateSwapDtoV2":{"type":"object","properties":{"endTime":{"type":"string","example":"1691815173"},"chainId":{"type":"number","example":1},"offerer":{"type":"string"},"takerAddress":{"type":"string"},"fees":{"type":"array","items":{"type":"string"}},"offer":{"type":"array","items":{"$ref":"#/components/schemas/ItemDto"}},"consideration":{"type":"array","items":{"$ref":"#/components/schemas/ItemDto"}},"creatorAddress":{"type":"string"},"royalty":{"type":"number"},"royaltyRecipient":{"type":"string"}},"required":["endTime","chainId","offerer","takerAddress","fees","offer","consideration","creatorAddress","royalty","royaltyRecipient"]},"ValidateSwapDto":{"type":"object","properties":{"swapId":{"type":"string"},"signature":{"type":"string"}},"required":["swapId","signature"]},"AcceptSwapDto":{"type":"object","properties":{"swapId":{"type":"string"},"takerAddress":{"type":"string"},"offerCriteria":{"type":"array","items":{"type":"string"}},"considerationCriteria":{"type":"array","items":{"type":"string"}}},"required":["swapId","takerAddress","offerCriteria","considerationCriteria"]},"CancelSwapDto":{"type":"object","properties":{"swapId":{"type":"string"}},"required":["swapId"]},"Swap":{"type":"object","properties":{}},"MetadataDto":{"type":"object","properties":{"type":{"type":"string","enum":["NFT","TOKEN"]},"contractAddress":{"type":"string"},"tokenId":{"type":"string"}},"required":["type","contractAddress","tokenId"]},"GetMetadataDto":{"type":"object","properties":{"chainId":{"type":"number"},"metadataArray":{"type":"array","items":{"$ref":"#/components/schemas/MetadataDto"}}},"required":["chainId","metadataArray"]},"CreateAuctionDto":{"type":"object","properties":{"endTime":{"type":"string","example":"1691815173"},"startTime":{"type":"string","example":"1691815173"},"chainId":{"type":"number","example":1},"offerer":{"type":"string"},"startAmount":{"type":"string"},"endAmount":{"type":"string"},"fees":{"type":"array","items":{"type":"string"}},"offer":{"type":"array","items":{"$ref":"#/components/schemas/ItemDto"}},"creatorAddress":{"type":"string"}},"required":["endTime","startTime","chainId","offerer","startAmount","endAmount","fees","offer","creatorAddress"]},"ValidateAuctionDto":{"type":"object","properties":{"auctionId":{"type":"string"},"signature":{"type":"string"}},"required":["auctionId","signature"]},"ValidateBidDto":{"type":"object","properties":{"auctionId":{"type":"string"},"bidId":{"type":"string"}},"required":["auctionId","bidId"]},"BidAuctionDto":{"type":"object","properties":{"chainId":{"type":"number"},"auctionId":{"type":"string"},"token":{"type":"string"},"amount":{"type":"string"},"bidder":{"type":"string"}},"required":["chainId","auctionId","token","amount","bidder"]},"FinalizeAuctionDto":{"type":"object","properties":{"chainId":{"type":"number"},"auctionId":{"type":"string"}},"required":["chainId","auctionId"]},"CreateListingDto":{"type":"object","properties":{"chainId":{"type":"number"},"maker":{"type":"string"},"source":{"type":"string"},"token":{"type":"string"},"weiPrice":{"type":"string"},"expirationTime":{"type":"string"},"isListing":{"type":"boolean"},"currency":{"type":"string"}},"required":["chainId","maker","source","token","weiPrice","expirationTime","isListing","currency"]},"SubmitEndpointsDto":{"type":"object","properties":{"chainId":{"type":"number"},"data":{"type":"object"}},"required":["chainId","data"]},"BuyNftDto":{"type":"object","properties":{"chainId":{"type":"number"},"orderId":{"type":"string"},"taker":{"type":"string"},"source":{"type":"string"},"isLocal":{"type":"boolean"},"onePercentFee":{"type":"number"},"currency":{"type":"string"},"currencyChainId":{"type":"number"}},"required":["chainId","orderId","taker","source","isLocal","onePercentFee","currency","currencyChainId"]},"AcceptOfferDto":{"type":"object","properties":{"chainId":{"type":"number"},"token":{"type":"string"},"taker":{"type":"string"},"source":{"type":"string"}},"required":["chainId","token","taker","source"]},"AuthSignatureDto":{"type":"object","properties":{"chainId":{"type":"number"},"signature":{"type":"string"},"data":{"type":"object"}},"required":["chainId","signature","data"]},"CreateClientDto":{"type":"object","properties":{"hostname":{"type":"string"},"bannerUrl":{"type":"string"},"logoUrl":{"type":"string"},"favicon":{"type":"string"},"htmlTitle":{"type":"string"},"collections":{"type":"array","items":{"type":"string"}},"styles":{"type":"object"},"fonts":{"type":"object"},"apiKey":{"type":"string","default":""},"showCollectionName":{"type":"boolean"}},"required":["hostname","bannerUrl","logoUrl","favicon","htmlTitle","collections","styles","fonts","apiKey","showCollectionName"]},"UpdateClientDto":{"type":"object","properties":{}},"CreateClientSecretDto":{"type":"object","properties":{"hostname":{"type":"string"},"discordWebhook":{"type":"string"}},"required":["hostname","discordWebhook"]},"PostSaleDto":{"type":"object","properties":{"hostname":{"type":"string"},"title":{"type":"string"},"priceEth":{"type":"string"},"tokenPrice":{"type":"string"},"priceUsd":{"type":"string"},"seller":{"type":"string"},"buyer":{"type":"string"},"imageUrl":{"type":"string"},"favicon":{"type":"string"},"url":{"type":"string"}},"required":["hostname","title","priceEth","tokenPrice","priceUsd","seller","buyer","imageUrl","favicon","url"]},"PostActivityDto":{"type":"object","properties":{"tokenName":{"type":"string"},"contractAddress":{"type":"string"},"tokenId":{"type":"string"},"seller":{"type":"string"},"buyer":{"type":"string"},"price":{"type":"string"},"type":{"type":"string"},"image":{"type":"string"},"domain":{"type":"string"}},"required":["tokenName","contractAddress","tokenId","seller","buyer","price","type","image","domain"]},"CreateMarketDto":{"type":"object","properties":{"name":{"type":"string"},"type":{"type":"string"},"ticker":{"type":"string"},"chainId":{"type":"number","example":81457},"pointsUrl":{"type":"string"},"domain":{"type":"string"},"tokenUrl":{"type":"string"},"multiplier":{"type":"number","example":1}},"required":["name","type","ticker","chainId","pointsUrl","domain","tokenUrl","multiplier"]},"AddMarketDto":{"type":"object","properties":{"partner":{"type":"string"}},"required":["partner"]},"NFTActivityResponseDto":{"type":"object","properties":{}},"VerifyInteractionDto":{"type":"object","properties":{"task":{"type":"string"},"borrowString":{"type":"string"},"borrowToken":{"type":"string"},"borrowAmount":{"type":"number"},"collateralString":{"type":"string"},"collateralToken":{"type":"string"},"collateralAmount":{"type":"string"},"leverage":{"type":"number"},"chainId":{"type":"number"},"user":{"type":"string"}},"required":["task","borrowString","borrowToken","borrowAmount","collateralString","collateralToken","collateralAmount","leverage","chainId","user"]},"CreateSupplyDto":{"type":"object","properties":{"asset":{"type":"string"},"chainId":{"type":"number","example":137},"amount":{"type":"string"},"user":{"type":"string"}},"required":["asset","chainId","amount","user"]},"CreateBorrowDto":{"type":"object","properties":{"asset":{"type":"string"},"chainId":{"type":"number","example":1},"amount":{"type":"string"},"user":{"type":"string"}},"required":["asset","chainId","amount","user"]},"CheckMaxBorrowDto":{"type":"object","properties":{"asset":{"type":"string"},"chainId":{"type":"number"},"user":{"type":"string"}},"required":["asset","chainId","user"]},"CreateWithdrawDto":{"type":"object","properties":{"asset":{"type":"string"},"chainId":{"type":"number","example":11166111},"receiver":{"type":"string"},"amount":{"type":"string"},"user":{"type":"string"}},"required":["asset","chainId","receiver","amount","user"]},"CreateRepayDto":{"type":"object","properties":{"asset":{"type":"string"},"chainId":{"type":"number","example":81457},"receiver":{"type":"string"},"amount":{"type":"string"},"user":{"type":"string"}},"required":["asset","chainId","receiver","amount","user"]},"CreateApiKeyDto":{"type":"object","properties":{"label":{"type":"string","description":"Human-readable name for the key. Shown in usage and billing reports, so make it identify the customer.","example":"acme-analytics"},"owner":{"type":"string","description":"Who the key belongs to — company, team, or contact email.","example":"acme@example.com"},"expiresInDays":{"type":"number","description":"Days until the key expires. Omit for a key that never expires; 31 matches the monthly billing flow.","example":31,"minimum":0},"notes":{"type":"string","description":"Free-text notes for operators (deal terms, contact, ticket link)."},"plan":{"type":"string","description":"Plan the key starts on. Sets the credit allowance and rate limit unless overridden below. options are payg, analyst, builder, growth and enterprise","enum":["payg","analyst","builder","growth","enterprise","internal"],"default":"analyst"}}},"RenewKeyDto":{"type":"object","properties":{"days":{"type":"number","description":"Days to extend by — from the current expiry if the key is still live, or from now if it has lapsed. 0 removes the expiry entirely.","example":31,"default":31,"minimum":0}}},"CreateKycSession":{"type":"object","properties":{"callback":{"type":"string","description":"A URL for redirection post-verification"},"vendor_data":{"type":"string","description":"Unique identifier or data for the vendor"}},"required":["callback","vendor_data"]},"CreatePositionDto":{"type":"object","properties":{"position":{"type":"string","description":"Encrypted Payload"}},"required":["position"]},"AddtoWhitelistDto":{"type":"object","properties":{"address":{"type":"string","description":"Address to be whitelisted"}},"required":["address"]},"TrackDepositDto":{"type":"object","properties":{"address":{"type":"string","description":"Address of depositor"},"amount_deposited_in_usd":{"type":"number","description":"Amount deposited in usd"},"amount_of_tokens_deposited":{"type":"number","description":"Amount of tokens deposited"},"token_deposited":{"type":"string","description":"Name of token deposited"},"chainId":{"type":"number","description":"Network chain id"}},"required":["address","amount_deposited_in_usd","amount_of_tokens_deposited","token_deposited","chainId"]},"JoinMonitoringWaitlistDto":{"type":"object","properties":{"email":{"type":"string","description":"Email to notify when monitoring ships. The signup identity."},"wallet":{"type":"string","description":"Wallet whose positions the alerts should track"},"telegram":{"type":"string","description":"Telegram handle, with or without the leading @"},"x":{"type":"string","description":"X handle, with or without the leading @"}},"required":["email","wallet"]},"SetupLeverageDto":{"type":"object","properties":{"inputTokenString":{"type":"string","description":"Input token symbol (e.g. USDC, ETH)","example":"USDC"},"collateralTokenString":{"type":"string","description":"Collateral token symbol","example":"ETH"},"borrowTokenString":{"type":"string","description":"Borrow token symbol","example":"USDT"},"initialCollateral":{"type":"number","description":"Initial collateral amount in token units","example":100},"chainId":{"type":"number","description":"Chain ID (1 = Mainnet, 137 = Polygon)","example":1},"user":{"type":"string","description":"User wallet address","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"required":["inputTokenString","collateralTokenString","borrowTokenString","initialCollateral","chainId","user"]},"OpenLeverageDto":{"type":"object","properties":{"inputTokenString":{"type":"string","description":"Input token symbol (e.g. USDC, ETH)","example":"USDC"},"collateralTokenString":{"type":"string","description":"Collateral token symbol","example":"ETH"},"borrowTokenString":{"type":"string","description":"Borrow token symbol","example":"USDT"},"initialCollateral":{"type":"string","description":"Initial collateral amount in ETH units","example":"0.1"},"leverageMultiplier":{"type":"number","description":"Leverage multiplier (1-20x)","example":3},"chainId":{"type":"number","description":"Chain ID (1 = Mainnet, 137 = Polygon)","example":1},"user":{"type":"string","description":"User wallet address","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"required":["inputTokenString","collateralTokenString","borrowTokenString","initialCollateral","leverageMultiplier","chainId","user"]},"CloseLeverageDto":{"type":"object","properties":{"collateralTokenString":{"type":"string","description":"Collateral token symbol","example":"ETH"},"borrowTokenString":{"type":"string","description":"Borrow token symbol","example":"USDT"},"chainId":{"type":"number","description":"Chain ID where position exists","example":1},"user":{"type":"string","description":"User wallet address","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"required":["collateralTokenString","borrowTokenString","chainId","user"]},"UpdateCollateralDto":{"type":"object","properties":{"chainId":{"type":"number","description":"Chain ID","example":1},"collateralTokenString":{"type":"string","description":"Collateral token symbol","example":"ETH"},"borrowTokenString":{"type":"string","description":"Borrow token symbol","example":"USDT"},"amount":{"type":"string","description":"Amount to update","example":"0.1"},"user":{"type":"string","description":"User wallet address","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"required":["chainId","collateralTokenString","borrowTokenString","amount","user"]},"UpdateLeverageDto":{"type":"object","properties":{"chainId":{"type":"number","description":"Chain ID","example":1},"collateralTokenString":{"type":"string","description":"Collateral token symbol","example":"ETH"},"borrowTokenString":{"type":"string","description":"Borrow token symbol","example":"USDT"},"leverage":{"type":"number","description":"New leverage multiplier","example":3},"user":{"type":"string","description":"User wallet address","example":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e"}},"required":["chainId","collateralTokenString","borrowTokenString","leverage","user"]},"RFQOrderComponent":{"type":"object","properties":{"asset":{"type":"string","description":"Name of the asset","example":"Mineral Vault"},"type":{"type":"string","description":"Type of the component, e.g., RWA","example":"RWA"},"redeemPath":{"type":"string","description":"Redemption path, e.g., instant, rfq","example":"instant"},"redemptionTime":{"type":"string","description":"Redemption duration","example":"T+2 days"},"apy":{"type":"string","description":"Annual Percentage Yield","example":"5.1%"},"riskRating":{"type":"string","description":"Risk rating of the asset","example":"A"},"amount":{"type":"string","description":"Token amount in string form","example":"1000"}},"required":["asset","type","redeemPath","redemptionTime","apy","riskRating","amount"]},"RFQOrder":{"type":"object","properties":{"account":{"type":"string","description":"User account address","example":"0x9876abcd..."},"chainId":{"type":"number","description":"Chain ID","example":1},"marketId":{"type":"string","description":"Market ID","example":"eth-usdc"},"collateralAsset":{"type":"string","description":"Collateral asset address","example":"0xa0b86991c6218b36..."},"borrowedAsset":{"type":"string","description":"Borrowed asset address","example":"0x6b175474e89094c44..."},"collateralValue":{"type":"number","description":"Value of collateral","example":50000},"borrowedValue":{"type":"number","description":"Value of borrowed asset","example":20000},"collateralAmount":{"type":"number","description":"Collateral amount","example":100},"borrowedAmount":{"type":"number","description":"Borrowed amount","example":50},"underlyingAsset":{"type":"string","description":"Underlying asset address","example":"0x123456..."},"penalty":{"type":"string","description":"Penalty percentage","example":"2.5%"},"apy":{"type":"string","description":"Annual Percentage Yield","example":"6%"},"riskRating":{"type":"string","description":"Risk rating","example":"BBB"},"permissionType":{"type":"string","description":"Permission type (permissioned or permissionless)","example":"permissionless"},"redemptionTime":{"type":"string","description":"Redemption time","example":"T+0"},"timestamp":{"type":"number","description":"Unix timestamp","example":1699999999},"components":{"description":"List of vault components","type":"array","items":{"$ref":"#/components/schemas/RFQOrderComponent"}}},"required":["account","chainId","marketId","collateralAsset","borrowedAsset","collateralValue","borrowedValue","collateralAmount","borrowedAmount","underlyingAsset","penalty","apy","riskRating","permissionType","redemptionTime","timestamp"]},"RedemptionRequestResponseDto":{"type":"object","properties":{"id":{"type":"string"},"userAddress":{"type":"string"},"transactionHash":{"type":"string"},"amount":{"type":"string"},"tokenSymbol":{"type":"string"},"status":{"type":"string","enum":["pending","processing","completed","expired","failed","cancelled"]},"estimatedRedemptionDate":{"format":"date-time","type":"string"},"actualRedemptionDate":{"format":"date-time","type":"string"},"designatedAddress":{"type":"string"},"chainId":{"type":"number"},"blockNumber":{"type":"number"},"gasUsed":{"type":"number"},"priority":{"type":"string","enum":["normal","high","critical"]},"metadata":{"type":"object"},"failureReason":{"type":"string"},"processingTransactionHash":{"type":"string"},"retryCount":{"type":"number"},"lastRetryAt":{"format":"date-time","type":"string"},"assignedOperator":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"externalReferenceId":{"type":"string"},"isExpired":{"type":"boolean"},"notificationSent":{"type":"boolean"},"estimatedCompletionTime":{"format":"date-time","type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","userAddress","transactionHash","amount","tokenSymbol","status","estimatedRedemptionDate","designatedAddress","chainId","blockNumber","priority","retryCount","tags","isExpired","notificationSent","createdAt","updatedAt"]},"PaginatedRedemptionRequestsDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/RedemptionRequestResponseDto"}},"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"totalPages":{"type":"number"},"hasNextPage":{"type":"boolean"},"hasPrevPage":{"type":"boolean"}},"required":["data","total","page","limit","totalPages","hasNextPage","hasPrevPage"]},"RedemptionSummaryDto":{"type":"object","properties":{"totalRequests":{"type":"number"},"pendingCount":{"type":"number"},"processingCount":{"type":"number"},"completedCount":{"type":"number"},"expiredCount":{"type":"number"},"failedCount":{"type":"number"},"cancelledCount":{"type":"number"},"totalAmount":{"type":"string"},"pendingAmount":{"type":"string"},"completedAmount":{"type":"string"},"averageProcessingTime":{"type":"number"},"dateRange":{"type":"object"}},"required":["totalRequests","pendingCount","processingCount","completedCount","expiredCount","failedCount","cancelledCount","totalAmount","pendingAmount","completedAmount","averageProcessingTime","dateRange"]},"RedemptionStatsDto":{"type":"object","properties":{"daily":{"type":"array","items":{"type":"string"}},"statusDistribution":{"type":"array","items":{"type":"string"}},"priorityDistribution":{"type":"array","items":{"type":"string"}},"tokenDistribution":{"type":"array","items":{"type":"string"}},"chainDistribution":{"type":"array","items":{"type":"string"}},"performanceMetrics":{"type":"object"}},"required":["daily","statusDistribution","priorityDistribution","tokenDistribution","chainDistribution","performanceMetrics"]},"HealthCheckDto":{"type":"object","properties":{"status":{"type":"string"},"timestamp":{"format":"date-time","type":"string"},"pendingCount":{"type":"number"},"expiredCount":{"type":"number"},"processingCount":{"type":"number"},"avgResponseTime":{"type":"number"},"databaseStatus":{"type":"string"},"redisStatus":{"type":"string"},"issues":{"type":"array","items":{"type":"string"}}},"required":["status","timestamp","pendingCount","expiredCount","processingCount","avgResponseTime","databaseStatus","redisStatus"]},"CreateRedemptionRequestDto":{"type":"object","properties":{"userAddress":{"type":"string","description":"User wallet address","example":"0x742d35cc6634C0532925a3b8c17B0d8c2e1c2F8d"},"tokenAddress":{"type":"string","description":"User wallet address","example":"0x742d35cc6634C0532925a3b8c17B0d8c2e1c2F8d"},"transactionHash":{"type":"string","description":"Transaction hash of the unstake transaction","example":"0x8b8e0a7f2c5d4f6e9a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4"},"amount":{"type":"string","description":"Amount to be redeemed (in wei or token smallest unit)","example":"1000000000000000000"},"tokenSymbol":{"type":"string","description":"Token symbol","example":"stETH"},"designatedAddress":{"type":"string","description":"Designated liquidity provider address","example":"0x123d35cc6634C0532925a3b8c17B0d8c2e1c2ABC"},"chainId":{"type":"number","description":"Blockchain network chain ID","example":98866},"blockNumber":{"type":"number","description":"Block number of the transaction","example":18500000},"gasUsed":{"type":"number","description":"Gas used in the transaction","example":150000},"metadata":{"type":"object","description":"Additional metadata (optional)"},"tags":{"description":"Tags for categorization (optional)","type":"array","items":{"type":"string"}},"externalReferenceId":{"type":"string","description":"External reference ID for integration (optional)"}},"required":["userAddress","tokenAddress","transactionHash","amount","tokenSymbol","designatedAddress","chainId","blockNumber"]},"UpdateRedemptionRequestStatusDto":{"type":"object","properties":{"status":{"type":"string","description":"Status update","enum":["pending","processing","completed","expired","failed","cancelled"]},"signature":{"type":"string","description":"Digital signature for authorization","example":"0x8b8e0a7f2c5d4f6e9a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4"},"signatureData":{"type":"object","description":"Claim data","example":{"userAddress":"0x742d35cc6634C0532925a3b8c17B0d8c2e1c2F8d","timestamp":1727088000,"nonce":"1234567890"}}},"required":["signature","signatureData"]},"BulkUpdateRedemptionRequestStatusDto":{"type":"object","properties":{"ids":{"description":"Array of request IDs to update","type":"array","items":{"type":"string"}},"status":{"type":"string","description":"Status to set for all selected requests","enum":["pending","processing","completed","expired","failed","cancelled"]},"signature":{"type":"string","description":"Digital signature for authorization","example":"0x8b8e0a7f2c5d4f6e9a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4"},"signatureData":{"type":"object","description":"Claim data","example":{"userAddress":"0x742d35cc6634C0532925a3b8c17B0d8c2e1c2F8d","timestamp":1727088000,"nonce":"1234567890"}}},"required":["signature","signatureData"]},"CreateRFQRequestDto":{"type":"object","properties":{"sessionKey":{"type":"string","description":"Encrypted payload key to verify source of endpoint"},"walletAddress":{"type":"string","description":"User address"},"redeemAsset":{"type":"string","description":"Token user is selling"},"redemptionAsset":{"type":"string","description":"Token user is buying"},"amount":{"type":"string","description":"Amount user is selling (in wei)"},"type":{"type":"string","description":"Type of redemption request, majorly lst and instant_redemption supported for now"},"chainId":{"type":"number","description":"Chain ID","example":98866},"slippageTolerance":{"type":"number","description":"Slippage tolerance percentage","default":1},"expiry":{"type":"number","description":"Expiry duration in minutes","default":60}},"required":["sessionKey","walletAddress","redeemAsset","redemptionAsset","amount","type","chainId","slippageTolerance","expiry"]},"SignatureDto":{"type":"object","properties":{"signatureType":{"type":"number","description":"Signature type"},"v":{"type":"number","description":"Signature v parameter","example":27},"r":{"type":"string","description":"Signature r parameter"},"s":{"type":"string","description":"Signature s parameter"}},"required":["signatureType","v","r","s"]},"CreateBidDto":{"type":"object","properties":{"requestId":{"type":"string","description":"Swap request ID"},"liquidationId":{"type":"string","description":"Liquidation ID"},"maker":{"type":"string","description":"Market maker address"},"makerAmount":{"type":"string","description":"Amount MM provides (in wei)"},"partialAmount":{"type":"string","description":"Partial amount (if partial bid)"},"debtAmountToLiquidate":{"type":"number","description":"Debt amount to liquidate"},"liquidationBonusPercentage":{"type":"number","description":"Liquidation bonus in percentage of real liquidation bonus, e.g 70 means 70%","default":100},"orderInfo":{"type":"object","description":"Order Info"},"signature":{"description":"Maker permit signature","allOf":[{"$ref":"#/components/schemas/SignatureDto"}]},"expiry":{"type":"number","description":"Expiry duration in minutes","default":10},"settlementType":{"type":"string","description":"Settlement type: \"instant\" (default) or \"delayed\" (MM will settle later)","enum":["instant","delayed"],"default":"instant"},"estimatedSettlementTime":{"type":"number","description":"Estimated settlement time in hours from activeFrom (for delayed bids). Defaults to MM setting or 24 hours. Converted internally to a unix timestamp."}},"required":["maker","makerAmount","expiry"]},"InitiatePreApprovalDto":{"type":"object","properties":{"chainId":{"type":"number","description":"Chain ID","example":98866},"redemptionAsset":{"type":"string","description":"Redemption asset address (maker token)"},"redeemAsset":{"type":"string","description":"Redeem asset address (taker token)"},"redemptionAmount":{"type":"number","description":"Redemption amount (maker amount)"},"redeemAmount":{"type":"number","description":"Redeem amount (taker amount)"},"marketMaker":{"type":"string","description":"Market maker address"},"expiry":{"type":"number","description":"Expiry duration in seconds timestamp","default":60}},"required":["chainId","redemptionAsset","redeemAsset","redemptionAmount","redeemAmount","marketMaker","expiry"]},"SubmitPreApprovalDto":{"type":"object","properties":{"preApprovalId":{"type":"string","description":"Pre-approval ID from initiate step"},"maxLiquidityPerTx":{"type":"string","description":"Max liquidity per transaction"},"signature":{"description":"Signed RFQ order signature","allOf":[{"$ref":"#/components/schemas/SignatureDto"}]}},"required":["preApprovalId","signature"]},"SubmitLiquidationBidDto":{"type":"object","properties":{"liquidationId":{"type":"string","description":"Liquidation ID"},"requestId":{"type":"string","description":"Swap request ID"},"debtAmountToLiquidate":{"type":"number","description":"Debt amount to liquidate"},"liquidationBonusPercentage":{"type":"number","description":"Liquidation bonus in percentage of real liquidation bonus, e.g 70 means 70%","default":100},"marketMaker":{"type":"string","description":"Market maker address"},"maker":{"type":"string","description":"Market maker address (alias for marketMaker)"},"makerAmount":{"type":"string","description":"Amount MM provides (in wei)"},"partialAmount":{"type":"string","description":"Partial amount (if partial bid)"},"signature":{"description":"Bid signature","allOf":[{"$ref":"#/components/schemas/SignatureDto"}]},"orderInfo":{"type":"object","description":"Order Info"},"expiry":{"type":"number","description":"Expiry in Minutes"},"activeFrom":{"type":"number","description":"Duration after which bid is considered in minutes","default":0},"requestLRT":{"type":"boolean","description":"Request LRT Token instead of redeem asset"},"settlementType":{"type":"string","description":"Settlement type: \"instant\" (default) or \"delayed\" (MM will settle later)","enum":["instant","delayed"],"default":"instant"},"estimatedSettlementTime":{"type":"number","description":"Estimated settlement time in hours from activeFrom (for delayed bids)."}},"required":["activeFrom"]},"CreateSwapRequestDto":{"type":"object","properties":{"walletAddress":{"type":"string","description":"User address"},"redeemAsset":{"type":"string","description":"Token user is selling"},"redemptionAsset":{"type":"string","description":"Token user is buying"},"amount":{"type":"string","description":"Amount user is selling (in wei)"},"chainId":{"type":"number","description":"Chain ID","example":98866},"slippageTolerance":{"type":"number","description":"Slippage tolerance percentage","default":1},"expiry":{"type":"number","description":"Expiry duration in minutes","default":60},"swapType":{"type":"string","description":"Swap execution type: \"direct\" (user calls fillLimitOrder, default) or \"system\" (bundled execution)","enum":["direct","system"],"default":"direct"},"fullAuctionEnabled":{"type":"boolean","description":"Mark this request as a \"Create Auction\" (no pre-committed LP) rather than instant fill. Surfaces it on the public Auctions board and the dashboard \"My Auctions\" tab.","default":false},"referral":{"type":"string","description":"Address to credit with a referral commission on this trade. Stored on the request and paid out of the settlement alongside the protocol fee recipients."},"referralFeeBps":{"type":"number","description":"Referral commission in basis points of the settled notional (flat, not per-day). Additive: it comes out of the user payout, like any other fee recipient. Rejected above the configured maximum (default 100 bps).","example":25}},"required":["walletAddress","redeemAsset","redemptionAsset","amount","chainId","slippageTolerance","expiry"]},"SoftLiquidationParamsDto":{"type":"object","properties":{"maxDebtPercentage":{"type":"number","description":"Max % of debt to liquidate (fallback cap)","default":10},"dustThresholdUSD":{"type":"number","description":"USD value below which to liquidate 100%","default":5},"healthBufferPercent":{"type":"number","description":"Buffer % below LLTV for target ratio","default":5},"enabled":{"type":"boolean","description":"Enable soft liquidation","default":true}}},"PriceStrategyParamsDto":{"type":"object","properties":{"bonusRecipient":{"type":"string","description":"Address to receive remaining bonus (defaults to borrower if not set)"}}},"CreateVaultMarketConfigDto":{"type":"object","properties":{"vaultAddress":{"type":"string","description":"Vault address"},"marketId":{"type":"string","description":"Market ID"},"curatorAddress":{"type":"string","description":"Vault curator address"},"chainId":{"type":"number","description":"Chain ID"},"strategyType":{"type":"string","description":"Liquidation strategy type"},"liquidators":{"description":"Liquidators","type":"array","items":{"type":"string"}},"softLiquidationParams":{"description":"Soft liquidation parameters","allOf":[{"$ref":"#/components/schemas/SoftLiquidationParamsDto"}]},"priceStrategyParams":{"description":"Price strategy parameters","allOf":[{"$ref":"#/components/schemas/PriceStrategyParamsDto"}]},"largeLiquidationThreshold":{"type":"string","description":"Large liquidation threshold in token units"}},"required":["vaultAddress","marketId","curatorAddress","chainId"]},"ClaimVaultMarketDto":{"type":"object","properties":{"vaultAddress":{"type":"string","description":"Vault address"},"marketId":{"type":"string","description":"Market ID"},"chainId":{"type":"number","description":"Chain ID"},"curatorAddress":{"type":"string","description":"Curator address"}},"required":["vaultAddress","marketId","chainId","curatorAddress"]},"UpdateVaultMarketConfigDto":{"type":"object","properties":{"strategyType":{"type":"string","description":"Liquidation strategy type"},"curatorAddress":{"type":"string","description":"Curator address"},"liquidators":{"description":"Liquidators","type":"array","items":{"type":"string"}},"softLiquidationParams":{"description":"Soft liquidation parameters","allOf":[{"$ref":"#/components/schemas/SoftLiquidationParamsDto"}]},"priceStrategyParams":{"description":"Price strategy parameters","allOf":[{"$ref":"#/components/schemas/PriceStrategyParamsDto"}]},"largeLiquidationThreshold":{"type":"string","description":"Large liquidation threshold in token units"}},"required":["curatorAddress"]},"CreateOctarineTokenDto":{"type":"object","properties":{"chainId":{"type":"number"},"address":{"type":"string"},"name":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"number"},"logoURI":{"type":"string"}},"required":["chainId","address","name","symbol","decimals"]},"UpdateOctarineTokenDto":{"type":"object","properties":{"name":{"type":"string"},"symbol":{"type":"string"},"decimals":{"type":"number"},"logoURI":{"type":"string"}}},"RecordApprovalDto":{"type":"object","properties":{"txHash":{"type":"string","description":"Transaction hash"},"walletAddress":{"type":"string","description":"Wallet address"},"tokenAddress":{"type":"string","description":"Token address"},"spenderAddress":{"type":"string","description":"Spender address"},"amount":{"type":"string","description":"Approval amount"},"chainId":{"type":"number","description":"Chain ID"},"approvalType":{"type":"string","description":"Approval type"},"metadata":{"type":"object","description":"Additional metadata"}},"required":["txHash","walletAddress","tokenAddress","spenderAddress","amount","chainId"]},"StandingOrderYieldRoutingDto":{"type":"object","properties":{"depositAmount":{"type":"string","description":"Maker-token amount (wei, string) the MM deposits into the routing safe selected by the server for this (chain, makerToken) pair. The safe is chosen from chain config — MMs do not pick it."},"vault":{"type":"string","description":"Optional Morpho vault address to park the deposit in. Must be a curated vault for the chain whose underlying asset is the makerToken. Falls back to the vault saved in chain config when omitted. Only applies to backend-safe routing."}},"required":["depositAmount"]},"InitiateStandingOrderDto":{"type":"object","properties":{"marketMaker":{"type":"string","description":"Market maker address"},"redemptionAsset":{"type":"string","description":"Redemption asset address (maker token - what MM provides)"},"redeemAsset":{"type":"string","description":"Redeem asset address (taker token - what user sells)"},"spreadBps":{"type":"number","description":"Optional spread-from-NAV in basis points, kept for UI/reporting only. The maker amount is now supplied directly via `makerAmount` — the server no longer derives it from a NAV oracle."},"redeemAmount":{"type":"string","description":"Taker amount (amount of redeemAsset the MM accepts, in wei, as a string to avoid precision loss)"},"makerAmount":{"type":"string","description":"Maker amount (amount of redemptionAsset the MM provides for the full takerAmount, in wei). Required — server no longer prices via NAV oracle."},"chainId":{"type":"number","description":"Chain ID","example":98866},"expiry":{"type":"number","description":"Expiry duration in minutes","default":60},"settlementType":{"type":"string","description":"Settlement type: \"instant\" (MM must hold maker balance now) or \"delayed\" (MM commits to be funded by estimatedSettlementTime; balance is not required up-front).","enum":["instant","delayed"],"default":"instant"},"estimatedSettlementTime":{"type":"number","description":"Estimated settlement time in hours from activation (required when settlementType is \"delayed\")."},"yieldRouting":{"description":"Optional yield-routing config. When omitted, the legacy direct-approval flow is used (MM approves makerToken; 0x pulls from the MM wallet on fill). When set, the deposit moves into a safe (and a Morpho vault for backend-safe).","allOf":[{"$ref":"#/components/schemas/StandingOrderYieldRoutingDto"}]}},"required":["marketMaker","redemptionAsset","redeemAsset","redeemAmount","makerAmount","chainId","expiry"]},"SubmitStandingOrderDto":{"type":"object","properties":{"standingOrderId":{"type":"string","description":"Standing order ID from initiate step"},"signature":{"description":"Signed RFQ order signature","allOf":[{"$ref":"#/components/schemas/SignatureDto"}]},"maxLiquidityPerTx":{"type":"string","description":"Max liquidity per transaction (optional override)"}},"required":["standingOrderId","signature"]},"RecordStandingOrderDepositDto":{"type":"object","properties":{"txHash":{"type":"string","description":"Hash of the funding txns the MM broadcast (transfer→safe [+ approve/deposit→vault]) at initiate time. Stored optimistically so a failed submit can be recovered without depositing twice."},"marketMaker":{"type":"string","description":"Market maker address (for authorization)"}},"required":["txHash","marketMaker"]},"CloseStandingOrderDto":{"type":"object","properties":{"marketMaker":{"type":"string","description":"Market maker address (for authorization)"}},"required":["marketMaker"]},"MigrateStandingOrderVaultDto":{"type":"object","properties":{"newVault":{"type":"string","description":"Target curated Morpho vault to move the parked liquidity into. Must hold the makerToken as its underlying asset."},"marketMaker":{"type":"string","description":"Market maker address (for authorization)"}},"required":["newVault","marketMaker"]},"UpdateStandingOrderDto":{"type":"object","properties":{"spreadBps":{"type":"number","description":"Updated spread in basis points"},"maxLiquidityPerTx":{"type":"string","description":"Updated max liquidity per tx (wei)"},"isActive":{"type":"boolean","description":"Activate/deactivate"},"marketMaker":{"type":"string","description":"Market maker address (for authorization)"}},"required":["marketMaker"]},"CreateNavOracleDto":{"type":"object","properties":{"tokenAddress":{"type":"string","description":"Token address"},"chainId":{"type":"number","description":"Chain ID"},"oracleAddress":{"type":"string","description":"Chainlink oracle contract address"},"tokenSymbol":{"type":"string","description":"Token symbol (optional)"}},"required":["tokenAddress","chainId","oracleAddress"]},"UpdateNavOracleDto":{"type":"object","properties":{"oracleAddress":{"type":"string","description":"Updated oracle address"},"isActive":{"type":"boolean","description":"Activate/deactivate"}}},"SubmitKYCDto":{"type":"object","properties":{"provider":{"type":"string","description":"KYC Provider","enum":["sumsub","securitize"]},"walletAddress":{"type":"string","description":"Wallet Address"},"shareToken":{"type":"string","description":"Sumsub Share Token"},"applicantId":{"type":"string","description":"Sumsub Applicant ID"},"code":{"type":"string","description":"Securitize Auth Code"}},"required":["provider","walletAddress"]},"ShareKYCDto":{"type":"object","properties":{"walletAddress":{"type":"string","description":"Wallet Address"},"asset":{"type":"string","description":"Asset Symbol"},"chainId":{"type":"number","description":"Chain ID"}},"required":["walletAddress","asset","chainId"]},"RegisterDelegatedMarketMakerDto":{"type":"object","properties":{"address":{"type":"string","description":"The maker — the address that appears as order.maker and whose funds settle. For Sprinter this is the LiquidityPool contract, NOT their EOA."},"name":{"type":"string","description":"Display name"},"fundingMode":{"type":"string","description":"Where the sell-side liquidity comes from. 'sprinter' skips the standing-allowance check and adds the just-in-time borrow leg at settlement; 'accountable' is a funded Safe wallet and enforces one-signer-one-wallet; 'wallet' is the ordinary parked-funds path.","enum":["wallet","accountable","sprinter"]},"signers":{"description":"EOAs allowed to sign orders where this row is the maker. For Accountable these must already be registered on chain via registerAllowedOrderSigner, sent from the wallet itself.","type":"array","items":{"type":"string"}},"source":{"type":"string","description":"Pool address for sprinter. Must equal `address` — the pool is the maker."},"supportedTokens":{"description":"Tokens this maker trades (empty = all)","type":"array","items":{"type":"string"}},"supportedChains":{"description":"Chains this maker trades on","type":"array","items":{"type":"number"}},"percentageFee":{"type":"number","description":"Fee split in bps-of-fee terms, as on any MM row"},"shareApiKeyWith":{"type":"string","description":"Address of an already-registered maker whose API key this row should share. Use it when one operator runs several makers (a LiquidityPool per chain) so a single key covers all of them — the maker address on each request selects which one it is for. Omit for a fresh key. Ignored when the row already exists (it keeps its own key)."}},"required":["address","fundingMode","signers"]},"CreateVaultRewardConfigDto":{"type":"object","properties":{}},"CreateMarketRewardConfigDto":{"type":"object","properties":{}}}}}