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

ParameterTypeDescription
networkstringRegistry network slug (e.g. ethereum, base, arbitrum, polygon, optimism, avalanche, stable, plume, monad, plasma, solana); /v1/chains lists slugs for chains with active vaults
addressstringVault 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

ParameterTypeDefaultDescription
pointsnumber360Snapshot points embedded in the detail payload, max 2160

Example

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

Response

{
  "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_net is null, 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.

FieldTypeMeaning
deposit_statusopen, closed, or unknownTri-state status for new deposits
withdraw_statusopen, closed, or unknownCoarse withdrawal-side mirror
freshness_secondsnumber or nullSeconds since the most recent successful sync wrote the row
is_depositableboolean or nullCompatibility boolean. Prefer deposit_status
deposit_capacity_usdnumber or nullRemaining 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

ParameterTypeDefaultDescription
daysnumber90Lookback window in days, max 365
pointsnumber360Maximum 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

ParameterTypeDefaultDescription
fromstring-ISO start timestamp, inclusive
tostring-ISO end timestamp, inclusive
limitnumber500Max 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

ParameterTypeDefaultDescription
completeOnlybooleanfalseWhen 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

ParameterTypeDefaultDescription
fromstring-ISO start timestamp, inclusive
tostring-ISO end timestamp, inclusive
limitnumber500Max points returned, max 1000
completeOnlybooleanfalseWhen 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.

On this page

Raw