Philidor Docs
API Reference

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

ParameterTypeDescription
networkstringNetwork slug: ethereum, base, arbitrum, polygon, optimism, avalanche
addressstringVault contract address (0x...)

Example

curl https://api.philidor.io/v1/vault/ethereum/0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458

Response

Includes all fields from the vault list, plus:

  • risk_vectors — individual vector scores (asset, platform, governance)
  • protocol_version, protocol_website, protocol_launch_date
  • audit_status, auditors[], audit_date, audit_report_url
  • is_immutable, timelock_seconds
  • deployment_timestamp
  • snapshots[] — historical TVL and APR data points
  • events[] — curator actions, incidents, parameter changes
  • rewards[] — 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.

FieldTypeMeaning
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_secondsnumber | nullAlways 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_depositableboolean | nullUnderlying boolean. true/false mirror open/closed; null mirrors unknown. Provided for compatibility — prefer deposit_status.
deposit_capacity_usdnumber | nullUSD 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?

CauseResolution
Protocol-specific gate detection not wiredUniswap LP positions and the bulk of Beefy's catalog (non-4626 strategies) remain structurally unknown.
Vault was added since the last indexer cycleResolves automatically within ~15–30 minutes (next sync cycle).
RPC / upstream API call failed during syncSelf-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 truefalse 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 from openclosed. Capital routed since the last cycle would now revert.
  • Info — vault went from closedopen. 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:

ProtocolHow depositability is determined
Morpho V1 / V2ERC-4626 maxDeposit(address(0)) on chain
Yearn V3ERC-4626 maxDeposit(address(0)) on chain
Spark SavingsERC-4626 maxDeposit(address(0)) on chain
Aave V3Reserve 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.
BeefyERC-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/V4Not 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/events

Response

{
  "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/markets

Only 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.../strategies

Only 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.../strategy

Only returns data for Beefy protocol vaults.

On this page

Raw