Vault Detail
GET /v1/vault for full risk breakdown, historical snapshots, score history, holders, events, Morpho markets, and strategy detail.
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 | Registry network slug (e.g. ethereum, base, arbitrum, polygon, optimism, avalanche, stable, plume, monad, plasma, solana); /v1/chains lists slugs for chains with active vaults |
| address | string | Vault address in the chain's namespace: 0x-hex for EVM chains, base58 (case-sensitive, never case-folded) for Solana. A cross-namespace address is a 400. |
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| points | number | 360 | Snapshot points embedded in the detail payload, max 2160 |
Example
curl https://api.philidor.io/v1/vault/ethereum/0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458Response
{
"data": {
"vault": {
"id": "morpho-1-0x8eb67a509616cd6a7c1b3c8c21d48ff57df3d458",
"name": "Gauntlet USDC Core",
"address": "0x8eB67A509616cd6A7c1B3c8C21D48FF57df3d458",
"chain_id": 1,
"chain_name": "Ethereum",
"protocol_id": "morpho",
"protocol_name": "Morpho",
"tvl_usd": 125000000,
"apr_net": 0.0523,
"borrow_apr": 0.046,
"borrow_reward_apr": 0.012,
"borrow_apr_net": 0.034,
"borrow_incentive_status": "observed",
"has_borrow_rewards": true,
"borrow_rewards": [
{
"side": "borrow",
"token_symbol": "MORPHO",
"token_address": "0x...",
"apr": 0.012,
"reward_type": "token_incentive",
"source": "merkl_api",
"campaign_id": "campaign-123",
"source_url": "https://app.merkl.xyz/..."
}
],
"borrow_status": "open",
"total_score": 8.5,
"risk_tier": "Prime",
"risk_vectors": {
"asset": { "score": 8.2, "weight": 0.3 },
"platform": { "score": 8.8, "weight": 0.3 },
"control": { "score": 9, "weight": 0.2 },
"history": { "score": 9.2, "weight": 0.2 }
},
"deposit_status": "open",
"withdraw_status": "open",
"freshness_seconds": 180,
"deposit_capacity_usd": 4250000,
"audit_status": "Audited",
"auditors": ["ChainSecurity"],
"strategy_type": "isolated_lending"
},
"snapshots": [],
"events": [],
"rewards": []
}
}Borrow Incentive Fields
borrow_apr is always the gross protocol borrow quote. Priced borrower rebates
are summed into borrow_reward_apr, and borrow_apr_net is computed as gross
minus rebates. It can be negative.
The borrow_incentive_status field is required for interpretation:
observed: active campaign evidence exists.none: the configured source was checked successfully and found no active campaign.unavailable: upstream data could not be established;borrow_apr_netisnull, never fabricated from a zero rebate.not_applicable: the vault has no borrower-side market.
borrow_rewards contains the per-token campaign evidence, including provenance
and distribution type when reported. Unpriced points rows have apr: 0 and
do not reduce the net cost. Aave position-wide net-APR campaigns are not treated
as borrower rebates because their supply/borrow attribution is ambiguous.
Current adapters obtain Aave V3 incentive records from Aave's protocol API,
Aave V4 and Spark campaign state from Merkl, Morpho market reward APR from the
Morpho Blue GraphQL market state with separate Merkl campaign evidence, and
Compound borrower emissions from on-chain reward configuration. Any mapping or
pricing failure fails closed to unavailable.
Depositability Fields
Every vault response carries these fields. deposit_status is the canonical routing signal.
| Field | Type | Meaning |
|---|---|---|
deposit_status | open, closed, or unknown | Tri-state status for new deposits |
withdraw_status | open, closed, or unknown | Coarse withdrawal-side mirror |
freshness_seconds | number or null | Seconds since the most recent successful sync wrote the row |
is_depositable | boolean or null | Compatibility boolean. Prefer deposit_status |
deposit_capacity_usd | number or null | Remaining deposit headroom. Null means uncapped, unpriced, or unknown |
Unknown depositability usually means protocol-specific gate detection is not wired, the vault entered after the latest hourly sync, or an upstream call failed during sync. Persistent unknowns are tracked operationally.
GET /v1/vault/{network}/{address}/snapshots
Return downsampled TVL, APR, and price-per-share snapshots for charting.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| days | number | 90 | Lookback window in days, max 365 |
| points | number | 360 | Maximum downsampled points, max 2160 |
Response
{
"data": [
{
"recorded_at": "2026-07-01T12:00:00Z",
"tvl_usd": 125000000,
"apr_net": 0.0523,
"borrow_apr": 0.046,
"borrow_reward_apr": 0.012,
"borrow_apr_net": 0.034,
"borrow_incentive_status": "observed",
"price_per_share": 1.0123
}
]
}GET /v1/vault/{network}/{address}/score-history
Return the score and tier timeline for a vault. Items are returned oldest to newest.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| from | string | - | ISO start timestamp, inclusive |
| to | string | - | ISO end timestamp, inclusive |
| limit | number | 500 | Max points returned, max 1000 |
Response
{
"data": [
{
"observed_at": "2026-06-10T01:46:00.000Z",
"change_type": "tier_change",
"prev_score": 7.9,
"new_score": 8.1,
"prev_tier": "Core",
"new_tier": "Prime",
"methodology_version": "v4.4"
}
]
}GET /v1/vault/{network}/{address}/holders
Return the latest holder-concentration snapshot for the vault share token.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| completeOnly | boolean | false | When true, indexing vaults keep coverage metadata but return null concentration metrics and no holders |
Response
{
"data": {
"status": "available",
"vault_id": "morpho-1-0x8eb67a509616cd6a7c1b3c8c21d48ff57df3d458",
"chain_id": 1,
"token_address": "0x8eb67a509616cd6a7c1b3c8c21d48ff57df3d458",
"holder_count": 120,
"external_holder_count": 94,
"top1_pct": 0.18,
"top5_pct": 0.52,
"top10_pct": 0.68,
"hhi": 0.09,
"external_top1_pct": 0.12,
"external_top5_pct": 0.41,
"external_top10_pct": 0.55,
"external_hhi": 0.06,
"protocol_managed_pct": 0.21,
"top_holders": [
{
"address": "0x1111111111111111111111111111111111111111",
"balance_raw": "1000000000000000000",
"pct": 0.18,
"label": "Example Treasury",
"category": "entity",
"method": "curated_label"
}
],
"indexed_to_block": 23000000,
"backfill_complete": true,
"coverage_status": "complete",
"computed_at": "2026-07-01T12:00:00Z"
}
}Coverage is complete when holder backfill is finished. indexing means concentration and top-holder fields are provisional.
GET /v1/vault/{network}/{address}/holders/history
Return historical holder-concentration snapshots. Items are returned oldest to newest.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| from | string | - | ISO start timestamp, inclusive |
| to | string | - | ISO end timestamp, inclusive |
| limit | number | 500 | Max points returned, max 1000 |
| completeOnly | boolean | false | When true, indexing rows keep coverage metadata but suppress provisional concentration and holder data |
Response
{
"data": [
{
"computed_at": "2026-07-01T12:00:00Z",
"holder_count": 120,
"external_holder_count": 94,
"top1_pct": 0.18,
"top5_pct": 0.52,
"top10_pct": 0.68,
"hhi": 0.09,
"protocol_managed_pct": 0.21,
"top_holders": [],
"indexed_to_block": 23000000,
"backfill_complete": true,
"coverage_status": "complete"
}
]
}GET /v1/vault/{network}/{address}/events
Get all events for a vault.
Response
{
"data": [
{
"id": 1234,
"event_type": "AllocationChange",
"severity": "Info",
"title": "Market allocation updated",
"description": "Curator adjusted market weights",
"tx_hash": "0x...",
"block_number": 19500000,
"occurred_at": "2026-02-20T10:00:00Z"
}
]
}Depositability changes are emitted as DepositabilityChange events.
GET /v1/vault/{network}/{address}/markets
Get market allocations for Morpho vaults. Returns collateral risk summary per lending market.
Only Morpho vaults return data. Non-Morpho vaults return 404.
GET /v1/vault/{network}/{address}/strategies
Get Yearn strategy breakdown from ydaemon.
Only Yearn vaults return data.
GET /v1/vault/{network}/{address}/strategy
Get Beefy strategy information with yield sources, risk flags, and APY.
Only Beefy vaults return data.