Vaults

GET /v1/vaults — search and filter 800+ vaults by chain, protocol, tier, APR, and TVL.

GET /v1/vaults

List all vaults with filtering, sorting, and pagination.

Query Parameters

ParameterTypeDefaultDescription
pagenumber1Page number
limitnumber20Results per page, max 100
chainstringFilter by chain (comma-separated: ethereum,base)
protocolstringFilter by protocol ID (comma-separated: morpho,aave)
curatorstringFilter by curator ID (comma-separated)
assetstringFilter by asset symbol (comma-separated: USDC,WETH)
riskTierstringFilter by risk tier (comma-separated, case-insensitive: prime, core, edge)
minRiskScorenumberMinimum risk score (0–10, inclusive). Vaults without a score are excluded.
maxRiskScorenumberMaximum risk score (0–10, inclusive). Vaults without a score are excluded.
minScorenumberAlias of minRiskScore (vaults.fyi-style, 0–10). See below.
min_scorenumbersnake_case alias of minScore.
searchstringSearch vault name, symbol, asset, protocol, curator
minTvlstringMinimum TVL in USD
stablecoinstringFilter stablecoin vaults (true/false)
lsdstringFilter LSD vaults (true/false)
singleExposurestringFilter single-exposure vaults (true/false)
noILstringFilter no impermanent loss (true/false)
auditedstringFilter audited vaults (true/false)
highConfidencestringFilter high-confidence vaults (true/false)
depositablestringFilter by current deposit capacity (true/false). See below.
sortBystringSort field: tvl_usd, apr_net, name, total_score, last_synced_at
sortOrderstringdescSort order: asc or desc

The depositable filter

Sourced from the ERC-4626 maxDeposit(address(0)) call against each vault. Captures everything that gates new deposits at the contract level: caps reached, vault paused, supply queue saturated, gates blocking new shares.

Each vault response carries deposit_status ("open", "closed", or "unknown"). The filter maps to those states:

  • depositable=true → returns open and unknown vaults — the "not explicitly closed" set. Use this when you don't want to drop vaults that haven't been on-chain probed yet (typically non-ERC4626 protocols).
  • depositable=false → returns only closed vaults (confirmed maxDeposit == 0 on chain). Useful for monitoring exit-only positions.
  • Omit the parameter for the default unfiltered list.

For strict server-side filtering (only confirmed-open, exclude unknowns), filter on the response field client-side: data.filter(v => v.deposit_status === 'open'). A ?deposit_status=open query is on the roadmap.

The minScore filter (vaults.fyi mirror)

Integrators familiar with vaults.fyi minVaultScore (0–100, Reputation Score) often want the same pattern on Philidor's 0–10 risk score.

vaults.fyiPhilidor equivalent
minVaultScore=80minScore=8.0 or riskTier=prime
minVaultScore=70minScore=7.0 or riskTier=prime,core
minVaultScore=50minScore=5.0 or riskTier=prime,core,edge

Filter server-side with minScore (or min_score), the 0–10 mirror of vaults.fyi minVaultScore / 10:

const res = await fetch(
  'https://api.philidor.io/v1/vaults?minScore=7.0&depositable=true&asset=USDC&limit=100'
);
const { data } = await res.json();

minScore and min_score are aliases of the canonical minRiskScore — all three accept a 0–10 score and exclude vaults that carry no score. Combine with riskTier for tier-band filtering.

Note: riskTier values are case-insensitiveprime and Prime both resolve to the same tier.

Example

curl "https://api.philidor.io/v1/vaults?riskTier=Prime&asset=USDC&sortBy=apr_net&sortOrder=desc&limit=5"

Response

{
  "data": [
    {
      "id": "morpho-1-0x...",
      "name": "Gauntlet USDC Core",
      "address": "0x...",
      "protocol_id": "morpho",
      "chain_id": 1,
      "chain_name": "Ethereum",
      "asset_symbol": "USDC",
      "tvl_usd": 125000000,
      "apr_net": 0.0523,
      "base_apr": 0.041,
      "total_score": 8.5,
      "risk_tier": "Prime",
      "strategy_type": "isolated_lending",
      "curator_name": "Gauntlet",
      "is_audited": true,
      "deposit_status": "open",
      "is_depositable": true,
      "deposit_capacity_usd": 4250000,
      "last_synced_at": "2026-02-25T12:00:00Z"
    }
  ],
  "meta": {
    "page": 1,
    "limit": 5,
    "total": 42,
    "totalPages": 9
  }
}

GET /v1/vaults/{id}

Get a vault by its database ID.

Path Parameters

ParameterTypeDescription
idstringVault ID (e.g., morpho-1-0x...)

Example

curl https://api.philidor.io/v1/vaults/morpho-1-0x8eb67a509616cd6a7c1b3c8c21d48ff57df3d458

Returns full vault detail with risk vectors, snapshots, events, and rewards. Same schema as vault detail.

Query Parameters

ParameterTypeDefaultDescription
pointsnumber360Snapshot points embedded in the detail response, max 2160
resolutionnumber360Compatibility alias for points, max 2160

POST /v1/vaults/batch

Look up vaults by database ID or contract address. The combined ids and addresses arrays may contain up to 100 items.

Body

{
  "ids": ["morpho-1-0x8eb67a509616cd6a7c1b3c8c21d48ff57df3d458"],
  "addresses": ["0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458"]
}

Response

{
  "data": [
    {
      "id": "morpho-1-0x8eb67a509616cd6a7c1b3c8c21d48ff57df3d458",
      "name": "Gauntlet USDC Core",
      "total_score": 8.5,
      "risk_tier": "Prime"
    }
  ]
}

GET /v1/vaults/scores

Lightweight bulk screening endpoint. It returns essential score, TVL, APR, and identity fields without full risk vectors.

Query Parameters

The endpoint supports the same filters as GET /v1/vaults. The default limit is 500 and the max is 1000.

Response

{
  "data": [
    {
      "id": "morpho-1-0x8eb67a509616cd6a7c1b3c8c21d48ff57df3d458",
      "address": "0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458",
      "chain_id": 1,
      "chain_name": "Ethereum",
      "protocol_id": "morpho",
      "asset_symbol": "USDC",
      "tvl_usd": 125000000,
      "apr_net": 0.0523,
      "total_score": 8.5,
      "risk_tier": "Prime",
      "is_active": true,
      "last_synced_at": "2026-07-01T12:00:00Z"
    }
  ],
  "meta": {
    "page": 1,
    "limit": 500,
    "total": 1,
    "totalPages": 1
  }
}

GET /v1/vaults/changes

Efficient polling endpoint for vault rows modified after a timestamp or returned cursor.

Query Parameters

ParameterTypeDefaultDescription
sincestringrequiredISO timestamp or cursor from the previous response
limitnumber100Results per request, max 500

Response

{
  "data": {
    "vaults": [
      {
        "id": "morpho-1-0x8eb67a509616cd6a7c1b3c8c21d48ff57df3d458",
        "total_score": 8.5,
        "risk_tier": "Prime",
        "last_synced_at": "2026-07-01T12:00:00Z"
      }
    ],
    "cursor": "2026-07-01T12:00:00.000Z|morpho-1-0x..."
  },
  "meta": {
    "total": 1
  }
}

GET /v1/vaults/with-critical-incidents

List vaults that have had critical incidents in the last 365 days, sorted by TVL.

Example

curl https://api.philidor.io/v1/vaults/with-critical-incidents

Response

{
  "data": [
    {
      "vault_id": "yearn-ethereum-0x...",
      "vault_name": "Yearn yETH",
      "chain_name": "Ethereum",
      "protocol_name": "Yearn",
      "curator_name": null,
      "tvl_usd": 5000000,
      "last_incident_at": "2025-11-30T00:00:00Z",
      "days_since_incident": 87,
      "incident_title": "yETH Stableswap Pool exploit",
      "incident_severity": "major",
      "event_severity": "Critical"
    }
  ]
}

On this page

Raw