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/assets

Response

{
  "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

ParameterTypeDefaultDescription
symbolstringExact symbol, case-insensitive
rangeenum30d7d, 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

ParameterTypeDefaultDescription
pagenumber1Page number (≥ 1)
limitnumber20Results per page (1–100)
chainnumber or stringChain: integer id or slug (e.g. 1, ethereum, solana)
categorystringFilter 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_typestringFilter by instrument type
defi_instrumentstringFilter by DeFi instrument classification
include_qualitystringInclude quality fields when supported
review_statusstringFilter by review status: reviewed, provisional, unreviewed
risk_tierstringFilter by risk tier: Prime, Core, Edge, or unknown (unscored assets — the same bucket the facets endpoint reports)
regulatory_wrapperstringFilter by regulatory wrapper (e.g. reg_d_506c, mica, genius_act_stablecoin)
kyc_gatestringFilter by investor-eligibility gate: permissionless, kyc_required, accredited, qualified_purchaser, professional_investor, institutional_only
searchstringCase-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_tier are null for assets that have not yet been scored (e.g. newly-discovered, provisional). Tiers are Prime (≥ 8), Core (≥ 5), Edge (< 5).
  • dimensions carries the full 0–10 risk-dimension set; a dimension is null when it does not apply to the asset's category (e.g. credit_quality only applies to rwa_credit).
  • backing_profile is the stablecoin reserve composition (percentages sum to ~100). It is null for assets without a backing profile (native assets, LSTs, governance tokens). Example — DAI returns offchain_pct: 40, crypto_exogenous_pct: 60.
  • risk_overlays lists modifiers such as yield_bearing or lockup.
  • underlying_asset is populated for yield-bearing wrappers (the asset the wrapper is built on), null for direct holdings.
  • name / issuer resolve to null for non-RWA tokens (these maps are RWA-specific) — this is expected, not an error.
  • The list is sorted by risk_score descending (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/facets

Response

{
  "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

ParameterTypeDescription
chain_idnumberChain id (e.g. 1 for Ethereum)
addressstringToken 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/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48

Response

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, so signature_valid is always true on 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-dimension weights and dimensions, the weighted_sum, the ordered overlays_applied (lockup / chain-overlay / dependency steps), the final score and tier, the methodology_version, and a reconstructed flag ("full" when the replay reconciles to the stored score, "partial" if not). null for 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.

On this page

Raw