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
| Parameter | Type | Description |
|---|---|---|
| address | string | Ethereum address (0x...) |
Example
curl https://api.philidor.io/v1/address/0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045/positionsResponse
{
"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