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
| Parameter | Type | Default | Description |
|---|---|---|---|
| page | number | 1 | Page number |
| limit | number | 20 | Results per page, max 100 |
| chain | string | — | Filter by chain (comma-separated: ethereum,base) |
| protocol | string | — | Filter by protocol ID (comma-separated: morpho,aave) |
| curator | string | — | Filter by curator ID (comma-separated) |
| asset | string | — | Filter by asset symbol (comma-separated: USDC,WETH) |
| riskTier | string | — | Filter by risk tier (comma-separated, case-insensitive: prime, core, edge) |
| minRiskScore | number | — | Minimum risk score (0–10, inclusive). Vaults without a score are excluded. |
| maxRiskScore | number | — | Maximum risk score (0–10, inclusive). Vaults without a score are excluded. |
| minScore | number | — | Alias of minRiskScore (vaults.fyi-style, 0–10). See below. |
| min_score | number | — | snake_case alias of minScore. |
| search | string | — | Search vault name, symbol, asset, protocol, curator |
| minTvl | string | — | Minimum TVL in USD |
| stablecoin | string | — | Filter stablecoin vaults (true/false) |
| lsd | string | — | Filter LSD vaults (true/false) |
| singleExposure | string | — | Filter single-exposure vaults (true/false) |
| noIL | string | — | Filter no impermanent loss (true/false) |
| audited | string | — | Filter audited vaults (true/false) |
| highConfidence | string | — | Filter high-confidence vaults (true/false) |
| depositable | string | — | Filter by current deposit capacity (true/false). See below. |
| sortBy | string | — | Sort field: tvl_usd, apr_net, name, total_score, last_synced_at |
| sortOrder | string | desc | Sort 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→ returnsopenandunknownvaults — 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 onlyclosedvaults (confirmedmaxDeposit == 0on 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.fyi | Philidor equivalent |
|---|---|
minVaultScore=80 | minScore=8.0 or riskTier=prime |
minVaultScore=70 | minScore=7.0 or riskTier=prime,core |
minVaultScore=50 | minScore=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-insensitive — prime 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
| Parameter | Type | Description |
|---|---|---|
| id | string | Vault ID (e.g., morpho-1-0x...) |
Example
curl https://api.philidor.io/v1/vaults/morpho-1-0x8eb67a509616cd6a7c1b3c8c21d48ff57df3d458Returns full vault detail with risk vectors, snapshots, events, and rewards. Same schema as vault detail.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| points | number | 360 | Snapshot points embedded in the detail response, max 2160 |
| resolution | number | 360 | Compatibility 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
| Parameter | Type | Default | Description |
|---|---|---|---|
| since | string | required | ISO timestamp or cursor from the previous response |
| limit | number | 100 | Results 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-incidentsResponse
{
"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"
}
]
}