> ## Documentation Index
> Fetch the complete documentation index at: https://tokenterminal.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> To query the Token Terminal data catalog, read https://tokenterminal.com/docs/catalog/agents-manual.md first. It is the whole catalog as one page: table naming grammar, key columns, partition and cluster rules, units, additivity, and the tables that are documented but not served yet.
> Never query a catalog table on a time bound alone. Also filter its cluster key, which you read from INFORMATION_SCHEMA.COLUMNS; an empty result means the object is a view, whose pruning contract is on its page. Compute is billed to the caller's own Google Cloud project.

# Interest rates

> Every rate update in every lending market.

One row per rate update in a lending market. `deposit_interest_rate` and `borrow_interest_rate` are annual fractions. Read `interest_rate_type` first: it says whether a row's rates apply from that block onward or over the interval that just closed.

## Columns

<table>
  <thead>
    <tr>
      <th width="270">Column</th>
      <th width="120">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr><td>`block_timestamp`</td><td>TIMESTAMP</td><td>Time of the block containing the rate update. Partition column.</td></tr>
    <tr><td>`block_number`</td><td>INTEGER</td><td>Number of the block containing the rate update.</td></tr>
    <tr><td>`transaction_hash`</td><td>STRING</td><td>Hash of the transaction that emitted the rate update.</td></tr>
    <tr><td>`log_index`</td><td>INTEGER</td><td>Position of the rate update in the block.</td></tr>
    <tr><td>`unique_id`</td><td>INTEGER</td><td>Row key: fingerprint of `chain_id`, `block_number`, `transaction_hash`, `log_index`, `lending_market_reserve_id`. The reserve is part of the key because one rate update can apply to several reserves at once.</td></tr>
    <tr><td>`event_type`</td><td>STRING</td><td>Constant `interest_rates`; stacking key across the lending facts.</td></tr>
    <tr><td>`project_id`</td><td>STRING</td><td>Protocol operating the market, such as `aave`.</td></tr>
    <tr><td>`app_id`</td><td>STRING</td><td>Deployment of the protocol the market belongs to.</td></tr>
    <tr><td>`chain_id`</td><td>STRING</td><td>Chain the rate update happened on.</td></tr>
    <tr><td>`lending_market_id`</td><td>STRING</td><td>Market the rate applies to; joins `dimensions.lending_markets`.</td></tr>
    <tr><td>`lending_market_reserve_id`</td><td>STRING</td><td>Reserve the rate applies to; joins `dimensions.lending_market_reserves`.</td></tr>
    <tr><td>`lending_market_contract_address`</td><td>STRING</td><td>Contract the market lives on; not a key.</td></tr>
    <tr><td>`token_id`</td><td>STRING</td><td>Token the rate applies to: `{token_address}-{chain_id}`.</td></tr>
    <tr><td>`token_address`</td><td>STRING</td><td>Contract address of that token.</td></tr>
    <tr><td>`token_symbol`</td><td>STRING</td><td>Symbol of that token.</td></tr>
    <tr><td>`deposit_index`</td><td>FLOAT</td><td>Cumulative interest index on the supply side, starting at 1. The ratio between two rows is what a supplied balance earned between them. Where a protocol reports a realized share price rather than an accumulator (Morpho Blue), it can fall below 1 after a market absorbs bad debt, and the ratio then reads the loss as well as the interest.</td></tr>
    <tr><td>`borrow_index`</td><td>FLOAT</td><td>Cumulative interest index on the borrow side, starting at 1. The ratio between two rows is what a debt accrued between them. Over long gaps between rows this ratio and the annualized rate diverge, because Morpho accrues on a truncated series while quoting APY on the exponential; the index is the realized figure.</td></tr>
    <tr><td>`interest_rate_type`</td><td>STRING</td><td>How to read the two rates. `forward-looking` means they apply from this block onward (Aave, Spark, HyperLend); `backward-looking` means they applied over the interval that ended at this block (Morpho Blue). Constant per protocol.</td></tr>
    <tr><td>`deposit_interest_rate`</td><td>FLOAT</td><td>Annual rate paid to suppliers, as a fraction: `0.05` reads 5%.</td></tr>
    <tr><td>`borrow_interest_rate`</td><td>FLOAT</td><td>Annual rate charged to borrowers, as a fraction: `0.05` reads 5%.</td></tr>
  </tbody>
</table>

## Sample queries

> [!WARNING]
>
> This table is large and split by day. Bound `block_timestamp` and filter `chain_id` on every query, or you read the whole table and the whole table is billed to you.

**One day, one app**

A market updates its rates whenever its utilization moves, so an active reserve has many rows in a day. `deposit_interest_rate` and `borrow_interest_rate` are annual fractions.

```sql theme={null}
select
    events.block_timestamp,
    events.token_symbol
from `facts_lending_markets.interest_rates` as events
where events.block_timestamp >= timestamp('2026-09-01')
  and events.block_timestamp < timestamp('2026-09-02')
  and events.chain_id = 'ethereum'
  and events.app_id = 'aave-v3'
limit 100
```

**Daily rate updates per app**

A row is a rate update on one reserve. Some apps price a whole asset at once, and every
reserve borrowing that asset then gets its own row, so this counts reserve updates rather
than repricings. To count repricings, count distinct `block_number`, `transaction_hash` and
`log_index`: one transaction can reprice several assets, so block and transaction alone
undercounts.

```sql theme={null}
select
    date(events.block_timestamp) as day,
    events.app_id,
    count(*) as updates
from `facts_lending_markets.interest_rates` as events
where events.block_timestamp >= timestamp('2026-08-01')
  and events.block_timestamp < timestamp('2026-09-01')
  and events.chain_id = 'ethereum'
group by day, events.app_id
order by day, updates desc
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.