Data Reference

Data Conventions

APR format, snapshot intervals, reward types, response envelope specification, timestamps, and numeric field formats.

APR Format

APR is stored as a decimal. 0.05 means 5%. Display by multiplying by 100.

FieldDescription
apr_netTotal APR including base yield plus incentive rewards. Point-in-time from last sync
base_aprNative protocol yield only, before rewards
apr_forwardForward-looking estimate when available
apr_net = base_apr + SUM(vault_rewards.apr)

Protocols without identifiable rewards set base_apr = apr_net and rewards = [].

Borrow-side rates use the opposite sign for incentives:

borrow_apr_net = borrow_apr - SUM(priced borrow reward APRs)

borrow_apr remains gross. borrow_reward_apr is the priced rebate total and borrow_apr_net may be negative. Unpriced points contribute zero. Consumers must read borrow_incentive_status: unavailable means the net rate is unknown, while none means an authoritative check found no active incentive.

Reward Types

TypeDescriptionExamples
token_incentiveProtocol token emissionsMORPHO, ARB, SPK
pointsNon-transferable point programsVarious
trading_feeLP trading feesCurve, Uniswap
strategySub-strategy yieldsYearn strategies

Every reward row has a side of supply or borrow. Supply rewards add to depositor yield; borrow rewards subtract from borrower cost. Do not combine the two sides.

Risk Scores

  • Range 0-10 where higher means stronger modeled resilience
  • Tiers Prime at 8.0 or above, Core from 5.0 to 7.9, Edge below 5.0
  • Vectors Asset 30, Platform and Strategy 30, Control and Governance 20, History 20
  • Recomputation Hourly sync cycles plus incident-triggered rescoring within minutes

Snapshot Intervals

DataIntervalStorage
Vault snapshots1 hourvault_snapshots table
Hourly aggregates1 hourTimescaleDB continuous aggregate
Daily aggregates1 dayTimescaleDB continuous aggregate
Risk scores1 hour plus incident-triggered recalcRisk score runs
Oracle freshness15 secondsRedis

Response Envelope

Successful non-paginated responses use data.

{
  "data": { ... }
}

Offset-paginated responses use meta with totals.

{
  "data": [ ... ],
  "meta": {
    "page": 1,
    "limit": 20,
    "total": 247,
    "totalPages": 13
  }
}

Cursor-style pages use hasMore.

{
  "data": [ ... ],
  "meta": {
    "page": 1,
    "limit": 20,
    "hasMore": false
  }
}

Errors use error.code and error.message.

{
  "error": {
    "code": "NOT_FOUND",
    "message": "Vault not found"
  }
}

There is no success key in the runtime envelope.

HTTP Status Codes

CodeMeaning
200Success
400Bad request for invalid parameters
401Authentication required
403Not permitted for the supplied key
404Resource not found
429Rate limited
500Internal server error
503Fail-safe or upstream unavailable

Timestamps

All timestamps are ISO 8601 UTC strings such as 2026-02-25T12:00:00Z.

Numeric Fields

Most amounts are JSON numbers, including tvl_usd, apr_net, and base_apr on vault rows. Some high-precision or database numeric fields serialize as strings, including total_score in selected live payloads, balance_raw, version_id, and graph totals such as totalUsd.

On this page

Raw