Portfolio

GET /v1/portfolio — risk-scored DeFi positions for any Ethereum address, with tier distribution and exposure analysis.

GET /v1/address/{address}/positions

Get all vault positions for an address across all supported chains. Returns individual vault positions with risk scores and a portfolio-level weighted risk assessment.

Path Parameters

ParameterTypeDescription
addressstringEthereum address (0x...)

Example

curl https://api.philidor.io/v1/address/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/positions

Response

{
  "data": {
    "aggregates": {
      "total_value_usd": 150000,
      "weighted_risk_score": 7.8,
      "weighted_risk_tier": "Core",
      "weighted_apr": 0.0523,
      "position_count": 3,
      "chain_count": 2,
      "risk_distribution": [{ "risk_tier": "Prime", "count": 1, "value_usd": 50000 }]
    },
    "positions": [
      {
        "vault_id": "morpho-1-0x...",
        "vault_address": "0x...",
        "vault_name": "Gauntlet USDC Core",
        "chain_id": 1,
        "chain_name": "Ethereum",
        "protocol_id": "morpho",
        "protocol_name": "Morpho",
        "asset_symbol": "USDC",
        "balance_raw": "50000000000",
        "balance_usd": 50000,
        "risk_score": 8.5,
        "risk_tier": "Prime",
        "apr_net": 0.0523,
        "share_of_vault": 0.0004,
        "tvl_usd": 125000000,
        "is_shutdown": false,
        "kind": "vault"
      }
    ],
    "chain_results": [
      { "chain_id": 1, "chain_name": "Ethereum", "status": "ok", "position_count": 1 }
    ]
  }
}

The /v1/address/* family has a 10 requests per 60 seconds anonymous limit. Invalid addresses return 400. A retryable 503 can occur when upstream position reads are unavailable or the API is in fail-safe mode.

Use Cases

  • Portfolio risk monitoring across all DeFi positions
  • Concentration analysis (exposure to single protocol/chain/curator)
  • Risk-weighted returns calculation
  • See Portfolio Risk Analysis for a full walkthrough

On this page

Raw