Assets
GET /v1/assets — token symbols plus full base-asset enrichment (risk dimensions, backing profile, scores) for every asset category.
GET /v1/assets
List all tracked asset symbols with their active vault counts. Use this to discover asset filters for the vaults list.
Example
curl https://api.philidor.io/v1/assetsResponse
{
"data": [
{ "asset_symbol": "USDC", "vault_count": 189 },
{ "asset_symbol": "WETH", "vault_count": 50 },
{ "asset_symbol": "USDT", "vault_count": 45 }
]
}GET /v1/assets/{symbol}/history
Daily investable TVL and TVL-weighted net APR for one exact asset symbol. The
series is persisted server-side, so multi-vault assets do not trigger a fan-out
over every underlying vault when the chart loads. Symbol matching is exact
after uppercasing: USDC does not include USDC.e or USTBL.
Path and query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| symbol | string | — | Exact symbol, case-insensitive |
| range | enum | 30d | 7d, 30d, 90d, or 1y rolling window |
Example
curl "https://api.philidor.io/v1/assets/USDC/history?range=30d"{
"data": [
{
"date": "2026-08-01",
"source": "derived",
"tvl_usd": 73082513.7,
"apr_net": 0.012
}
],
"meta": {
"symbol": "USDC",
"range": "30d",
"points": 30
}
}apr_net is a decimal (0.012 means 1.2%) and is weighted by investable TVL
for vaults reporting APR on that day. It is null when no included TVL has an
APR observation. Historical launch data may be reconstructed from Philidor's
change-only vault snapshots; new points are observed by the scheduled daily
read model. Every point's source is observed or derived. Derived rows use
current vault eligibility because the legacy snapshot stream did not preserve
historical active/shutdown assignments, so they are not exact point-in-time
universe membership. Missing days are not converted to zero.
GET /v1/assets/enriched
Paginated listing of base/underlying assets across all categories (stablecoins, LSTs/LRTs, wrapped BTC, governance tokens, native assets, and RWAs) with full risk-registry enrichment: risk score and tier, the complete risk-dimension set, stablecoin backing profile, risk overlays, issuer, institutional metadata, data provenance, reviewer, freshness, and per-chain risk overlays.
This is the place to pull context on a base token (USDC, USDT, AUSD, …) — the /v1/assets list above only returns symbols and vault counts.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
| page | number | 1 | Page number (≥ 1) |
| limit | number | 20 | Results per page (1–100) |
| chain | number or string | — | Chain: integer id or slug (e.g. 1, ethereum, solana) |
| category | string | — | Filter by category: native, fiat_backed_stablecoin, cdp_stablecoin, synthetic_stablecoin, lst, lrt, wrapped_btc, governance_token, defi_derivative, tokenized_treasury, t_bill_backed_stable, rwa_credit, commodity_backed, tokenized_equity, wrapped_crypto, unreviewed |
| instrument_type | string | — | Filter by instrument type |
| defi_instrument | string | — | Filter by DeFi instrument classification |
| include_quality | string | — | Include quality fields when supported |
| review_status | string | — | Filter by review status: reviewed, provisional, unreviewed |
| risk_tier | string | — | Filter by risk tier: Prime, Core, Edge, or unknown (unscored assets — the same bucket the facets endpoint reports) |
| regulatory_wrapper | string | — | Filter by regulatory wrapper (e.g. reg_d_506c, mica, genius_act_stablecoin) |
| kyc_gate | string | — | Filter by investor-eligibility gate: permissionless, kyc_required, accredited, qualified_purchaser, professional_investor, institutional_only |
| search | string | — | Case-insensitive substring match on symbol or address |
Example
curl "https://api.philidor.io/v1/assets/enriched?category=fiat_backed_stablecoin&limit=2"Response
{
"data": [
{
"asset_id": "3",
"asset_version_id": "1864",
"address": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"chain_id": 1,
"symbol": "USDC",
"name": null,
"category": "fiat_backed_stablecoin",
"review_status": "reviewed",
"risk_score": 9.25,
"risk_tier": "Prime",
"issuer": null,
"in_basket_a": false,
"dimensions": {
"peg_stability": 9.5,
"issuer_custody": 9.5,
"redeemability": 9,
"reserve_transparency": 9,
"governance_controls": 8,
"protocol_security": null,
"operator_quality": null,
"bridge_mechanism": null,
"dependency_depth": null,
"liquidity": 10,
"volatility": null,
"credit_quality": null,
"default_rate": null,
"recovery_rate": null,
"subadvisor_concentration": null,
"redemption_terms": null
},
"risk_overlays": [],
"instrument_type": null,
"hard_fail_flags": [],
"caps_applied": [],
"backing_profile": {
"offchain_pct": 100,
"crypto_exogenous_pct": 0,
"crypto_endogenous_pct": 0,
"delta_hedge_pct": 0
},
"underlying_asset": null,
"institutional": {
"regulatory_wrapper": null,
"regulatory_jurisdiction": null,
"kyc_gate": null,
"custodian_name": null,
"auditor_name": null,
"attestation_cadence": null,
"redemption_window": null,
"aum_usd": null,
"yield_pct": null,
"duration_days": null,
"currency": null,
"aum_native": null,
"fx_rate_used": null,
"fx_rate_at": null,
"aum_usd_source": null,
"yield_basis": null
},
"data_provenance": null,
"reviewed_by": null,
"reviewer": null,
"recorded_at": "2026-05-07T13:51:34.986Z",
"freshness": {
"last_refresh_at": null,
"age_hours": null,
"status": "unknown",
"last_status": null
},
"dependency_chain": [],
"methodology_version": "v1.3",
"chain_overlay": {
"multiplier": 1,
"bridge_centralization": 10,
"sequencer_centralization": 10,
"validator_set_size_score": 10,
"chain_age_score": 10,
"rationale": "L1 calibration anchor: PoS with ~1M+ validators, no sequencer, no canonical bridge dependency, 9+ years of uptime."
}
}
],
"meta": {
"page": 1,
"limit": 2,
"total": 206,
"totalPages": 103
}
}Field notes
risk_score/risk_tierarenullfor assets that have not yet been scored (e.g. newly-discovered, provisional). Tiers arePrime(≥ 8),Core(≥ 5),Edge(< 5).dimensionscarries the full 0–10 risk-dimension set; a dimension isnullwhen it does not apply to the asset's category (e.g.credit_qualityonly applies torwa_credit).backing_profileis the stablecoin reserve composition (percentages sum to ~100). It isnullfor assets without a backing profile (native assets, LSTs, governance tokens). Example — DAI returnsoffchain_pct: 40, crypto_exogenous_pct: 60.risk_overlayslists modifiers such asyield_bearingorlockup.underlying_assetis populated for yield-bearing wrappers (the asset the wrapper is built on),nullfor direct holdings.name/issuerresolve tonullfor non-RWA tokens (these maps are RWA-specific) — this is expected, not an error.- The list is sorted by
risk_scoredescending (unscored assets last).
GET /v1/assets/enriched/facets
Aggregate counts across the entire enriched-asset universe — useful for sizing filter chips. Independent of any active filter. The risk_tiers facet includes an explicit unknown bucket for unscored assets.
Example
curl https://api.philidor.io/v1/assets/enriched/facetsResponse
{
"data": {
"chains": [{ "chain_id": 1, "count": 427 }],
"categories": [{ "category": "tokenized_treasury", "count": 34 }],
"review_statuses": [{ "review_status": "reviewed", "count": 195 }],
"risk_tiers": [
{ "risk_tier": "Prime", "count": 14 },
{ "risk_tier": "Core", "count": 167 },
{ "risk_tier": "Edge", "count": 43 },
{ "risk_tier": "unknown", "count": 481 }
],
"regulatory_wrappers": [{ "regulatory_wrapper": "reg_d_506c", "count": 10 }],
"kyc_gates": [{ "kyc_gate": "kyc_required", "count": 19 }],
"jurisdictions": [{ "jurisdiction": "(unknown)", "count": 668 }],
"custodians": [{ "custodian": "(unknown)", "count": 668 }],
"auditors": [{ "auditor": "(unknown)", "count": 668 }]
}
}GET /v1/assets/{chain_id}/{address}
Full enrichment for a single base asset, keyed by chain and token contract address — the keys present on every vault object (chain_id + asset_address).
Path Parameters
| Parameter | Type | Description |
|---|---|---|
| chain_id | number | Chain id (e.g. 1 for Ethereum) |
| address | string | Token address in the chain's namespace: 0x-hex (any case) on EVM chains, base58 (case-sensitive) on Solana. Cross-namespace input is a 400. |
Example
curl https://api.philidor.io/v1/assets/1/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48Response
Returns the same object as an enriched list item, plus four detail-only fields:
version_history— up to the last 30 approved classification versions (risk_score,risk_tier,review_status,aum_usd,yield_pct,recorded_at).attestation_history— up to the last 50 verified reviewer attestations. Only attestations whose Ed25519 signature verifies against the reviewer key and the canonical payload are surfaced, sosignature_validis alwaystrueon returned entries; unsigned or non-verifying attestations are not client-facing.discovery— the registry source that surfaced the asset, when applicable.risk_score_breakdown— a reconstructible audit of the published score: per-dimensionweightsanddimensions, theweighted_sum, the orderedoverlays_applied(lockup / chain-overlay / dependency steps), the finalscoreandtier, themethodology_version, and areconstructedflag ("full"when the replay reconciles to the stored score,"partial"if not).nullfor unscored assets.
{
"data": {
"symbol": "USDC",
"category": "fiat_backed_stablecoin",
"risk_score": 9.25,
"risk_tier": "Prime",
"risk_score_breakdown": {
"category": "fiat_backed_stablecoin",
"weights": {
"issuer_custody": 0.25,
"reserve_transparency": 0.2,
"redeemability": 0.15,
"peg_stability": 0.15,
"governance_controls": 0.1,
"liquidity": 0.15
},
"dimensions": {
"issuer_custody": 9.5,
"reserve_transparency": 9,
"redeemability": 9,
"peg_stability": 9.5,
"governance_controls": 8,
"liquidity": 10
},
"weighted_sum": 9.25,
"overlays_applied": [],
"score": 9.25,
"tier": "Prime",
"methodology_version": "v1.3",
"reconstructed": "full"
},
"version_history": [
{
"asset_version_id": "1864",
"recorded_at": "2026-05-07T13:51:34.986Z",
"risk_score": 9.25,
"risk_tier": "Prime",
"review_status": "reviewed",
"aum_usd": null,
"yield_pct": null
}
],
"attestation_history": [],
"discovery": null
}
}Returns 404 if no asset is found for that (chain_id, address), and 400 for a malformed address.