Vault Detail
GET /v1/vault — full risk breakdown, historical events, Morpho markets, and Beefy/Yearn strategies.
GET /v1/vault/{network}/{address}
Get full vault details including risk vectors, APR decomposition, audit status, snapshots, events, and rewards.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| network | string | Network slug: ethereum, base, arbitrum, polygon, optimism, avalanche |
| address | string | Vault contract address (0x...) |
Example
curl https://api.philidor.io/v1/vault/ethereum/0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458Response
Includes all fields from the vault list, plus:
risk_vectors— individual vector scores (asset, platform, governance)protocol_version,protocol_website,protocol_launch_dateaudit_status,auditors[],audit_date,audit_report_urlis_immutable,timelock_secondsdeployment_timestampsnapshots[]— historical TVL and APR data pointsevents[]— curator actions, incidents, parameter changesrewards[]— reward token breakdown (symbol, APR, type)
Depositability fields
Every vault response — list, detail, batch, and scores — carries the depositability fields below. deposit_status is the canonical signal clients should read; the others provide raw values and operational metadata.
| Field | Type | Meaning |
|---|---|---|
deposit_status | "open" | "closed" | "unknown" | Always present. Tri-state, explicit. open = accepts deposits over $100. closed = on-chain maxDeposit == 0 (caps reached, paused, gates blocking). unknown = not yet read on chain (typically non-ERC4626 protocols, or a vault added since the last sync). |
withdraw_status | "open" | "closed" | "unknown" | Always present. Coarse round-trip mirror. closed when the vault is in shutdown; open when operationally live and we have a confirmed deposit-side reading this cycle; unknown otherwise. Per-protocol withdraw-pause probes are on the roadmap. |
freshness_seconds | number | null | Always present (rarely null). Seconds since the last successful sync wrote this row. Use to enforce a client-side freshness SLA — e.g. reject any vault whose freshness_seconds > 3600. |
is_depositable | boolean | null | Underlying boolean. true/false mirror open/closed; null mirrors unknown. Provided for compatibility — prefer deposit_status. |
deposit_capacity_usd | number | null | USD headroom remaining before the cap. null when uncapped (uint256.max), when the vault has no TVL reference for pricing, or when status is unknown. |
Why this matters. A vault can advertise 20%+ APY while refusing new deposits — the yield is on the existing position and new principal would revert. Always check deposit_status before routing capital.
Recommended logic for integrators:
function shouldRoute(vault: { deposit_status: 'open' | 'closed' | 'unknown' }): boolean {
switch (vault.deposit_status) {
case 'open':
return true; // Verified on-chain right now
case 'closed':
return false; // Confirmed maxDeposit == 0 — deposit would revert
case 'unknown':
// Indexer hasn't probed this vault on-chain yet (typically Aave/Compound/
// Uniswap, which aren't ERC-4626). Pick the policy that suits your risk
// tolerance:
// - Conservative routers: skip until status is known.
// - Long-tail aggregators: include but do a pre-flight maxDeposit
// call from the user's wallet before composing the tx.
return false;
}
}Why might deposit_status be unknown?
| Cause | Resolution |
|---|---|
| Protocol-specific gate detection not wired | Uniswap LP positions and the bulk of Beefy's catalog (non-4626 strategies) remain structurally unknown. |
| Vault was added since the last indexer cycle | Resolves automatically within ~15–30 minutes (next sync cycle). |
| RPC / upstream API call failed during sync | Self-correcting on the next successful cycle. Persistent unknowns are tracked. |
Tracking depositability changes
Every time the indexer's sync cycle flips a vault's confirmed is_depositable state from true → false or vice versa, a DepositabilityChange event is appended to the events feed. Subscribe to these via the events endpoint instead of polling vault detail every minute:
curl "https://api.philidor.io/v1/events?eventType=DepositabilityChange&severity=Warning&limit=20"Severities map to direction:
Warning— vault went fromopen→closed. Capital routed since the last cycle would now revert.Info— vault went fromclosed→open. Previously-skipped vault is now accepting deposits again.
The event payload carries { from: "open"|"closed", to: "open"|"closed" }. Null transitions (vault appearing for the first time or dropping out of the indexer's probe set) are not emitted — they're observability noise, not real depositability changes.
Per-protocol detection method:
| Protocol | How depositability is determined |
|---|---|
| Morpho V1 / V2 | ERC-4626 maxDeposit(address(0)) on chain |
| Yearn V3 | ERC-4626 maxDeposit(address(0)) on chain |
| Spark Savings | ERC-4626 maxDeposit(address(0)) on chain |
| Aave V3 | Reserve flags (isFrozen, isPaused) + supplyCap headroom from the Aave API |
| Compound V3 (Comet) | isSupplyPaused() on chain (base asset is uncapped) |
| SparkLend (v1) | Reserve flags (isFrozen, isActive) read on chain + supplyCap decoded from the Aave V3 configuration bitmap (bits 116–151). Same headroom math as the Aave V3 path. |
| Beefy | ERC-4626 maxDeposit(address(0)) probe scoped to Beefy's type === "standard" vaults only. The vast majority of Beefy's catalog (Gov vaults, Boost contracts, cowcentrated managers) is not ERC-4626 and stays unknown by design. A Beefy-native paused() probe is on the roadmap. |
| Uniswap V2/V3/V4 | Not yet wired — LP positions have no native deposit gate. Stays unknown. |
GET /v1/vault/{network}/{address}/events
Get all events for a vault — incidents, parameter changes, allocation changes, curator actions.
Example
curl https://api.philidor.io/v1/vault/ethereum/0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458/eventsResponse
{
"success": true,
"data": [
{
"id": 1234,
"event_type": "allocation_change",
"severity": "info",
"title": "Market allocation updated",
"description": "Curator adjusted market weights",
"tx_hash": "0x...",
"block_number": 19500000,
"occurred_at": "2026-02-20T10:00:00Z"
}
]
}GET /v1/vault/{network}/{address}/markets
Get market allocations for Morpho vaults. Returns collateral risk summary per lending market.
Example
curl https://api.philidor.io/v1/vault/ethereum/0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458/marketsOnly returns data for Morpho protocol vaults. Returns 404 for non-Morpho vaults.
GET /v1/vault/{network}/{address}/strategies
Get strategy details for Yearn vaults. Returns sub-strategy breakdown from ydaemon.
Example
curl https://api.philidor.io/v1/vault/ethereum/0x.../strategiesOnly returns data for Yearn protocol vaults.
GET /v1/vault/{network}/{address}/strategy
Get strategy information for Beefy vaults. Returns processed strategy with yield sources, risk flags, and APY.
Example
curl https://api.philidor.io/v1/vault/ethereum/0x.../strategyOnly returns data for Beefy protocol vaults.