> ## 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.

# Prices

> One USD price per token and per curated asset, per day.

A price is one USD figure at one moment, held per token contract on one chain and per curated asset. `price` is that figure, and a row appears for each day a price was taken for that day.

## Coverage

Every chain we cover prices on.

<div class="tt-roster">
  <div class="tt-chips">
    <code>algorand</code>
    <code>aptos</code>
    <code>arbitrum</code>
    <code>avalanche</code>
    <code>base</code>
    <code>berachain</code>
    <code>blast</code>
    <code>bob</code>
    <code>bobanetwork</code>
    <code>bsc</code>
    <code>cardano</code>
    <code>celo</code>
    <code>chainflip</code>
    <code>ethereum</code>
    <code>flowevm</code>
    <code>fraxtal</code>
    <code>gnosis</code>
    <code>gravityalpha</code>
    <code>hedera</code>
    <code>hydradx</code>
    <code>hydradxevm</code>
    <code>hyperevm</code>
    <code>immutablezkevm</code>
    <code>ink</code>
    <code>iotex</code>
    <code>katananetwork</code>
    <code>linea</code>
    <code>manta</code>
    <code>megaeth</code>
    <code>monad</code>
    <code>movement</code>
    <code>near</code>
    <code>opbnb</code>
    <code>optimism</code>
    <code>plasma</code>
    <code>polkadotassethub</code>
    <code>polygon</code>
    <code>ripple</code>
    <code>robinhoodchain</code>
    <code>rootstock</code>
    <code>scroll</code>
    <code>seievm</code>
    <code>solana</code>
    <code>sonic</code>
    <code>stacks</code>
    <code>starknet</code>
    <code>stellar</code>
    <code>sui</code>
    <code>tempo</code>
    <code>tron</code>
    <code>unichain</code>
    <code>viction</code>
    <code>worldchain</code>
    <code>xdc</code>
    <code>xlayer</code>
    <code>zksyncera</code>
  </div>
</div>

## Tables

<Tabs>
  <Tab title="Token, daily">
    One row per token per day, in `metrics_tokens.price_daily`.

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

      <tbody>
        <tr><td><code>timestamp</code></td><td>TIMESTAMP</td><td>The moment the price was taken: midnight UTC in the daily table, the top of the hour in the hourly one.</td></tr>
        <tr><td><code>token\_id</code></td><td>STRING</td><td>Token the price belongs to: <code>\{token\_address}-\{chain\_id}</code>.</td></tr>
        <tr><td><code>chain\_id</code></td><td>STRING</td><td>Chain the token is deployed on.</td></tr>
        <tr><td><code>price</code></td><td>FLOAT64</td><td>The price in US dollars at that moment.</td></tr>
      </tbody>
    </table>
  </Tab>

  <Tab title="Token, hourly">
    One row per token per hour, in `metrics_tokens.price_hourly`. It keys the same way as the daily table, so moving a query between them means swapping the table name and the time bounds.

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

      <tbody>
        <tr><td><code>timestamp</code></td><td>TIMESTAMP</td><td>The moment the price was taken: midnight UTC in the daily table, the top of the hour in the hourly one.</td></tr>
        <tr><td><code>token\_id</code></td><td>STRING</td><td>Token the price belongs to: <code>\{token\_address}-\{chain\_id}</code>.</td></tr>
        <tr><td><code>chain\_id</code></td><td>STRING</td><td>Chain the token is deployed on.</td></tr>
        <tr><td><code>price</code></td><td>FLOAT64</td><td>The price in US dollars at that moment.</td></tr>
      </tbody>
    </table>
  </Tab>

  <Tab title="Asset, daily">
    One row per asset per day, in `metrics_assets.price_daily`. An asset price belongs to the asset itself, so it holds across every chain the asset is deployed on.

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

      <tbody>
        <tr><td><code>timestamp</code></td><td>TIMESTAMP</td><td>Midnight UTC of the day the price was taken.</td></tr>
        <tr><td><code>asset\_id</code></td><td>STRING</td><td>Identifier of the asset, for example <code>usdc</code>.</td></tr>
        <tr><td><code>price\_source</code></td><td>STRING</td><td>Which source the figure came from. It labels the price and measures nothing.</td></tr>
        <tr><td><code>price</code></td><td>FLOAT64</td><td>The asset's price in USD. Where more than one source has a price, we take them in a fixed order of preference.</td></tr>
      </tbody>
    </table>
  </Tab>
</Tabs>

## Sample queries

<Warning>
  `metrics_tokens.price_hourly` is large and split by month. Bound `timestamp` and filter `chain_id` on every query against it, or you read the whole table and the whole table is billed to you.
</Warning>

<Tabs>
  <Tab title="One asset, every chain">
    `dimensions.asset_tokens` maps one asset onto its deployments, and `token_id` is the key it shares with the price table, which holds one price per deployment.

    ```sql theme={null}
    select
        prices.timestamp,
        deployments.chain_id,
        prices.price
    from `metrics_tokens.price_daily` as prices
    join `dimensions.asset_tokens` as deployments
        using (token_id)
    where deployments.asset_id = 'usdc'
      and prices.timestamp >= timestamp('2026-07-01')
    order by prices.timestamp, deployments.chain_id
    ```
  </Tab>

  <Tab title="Asset against deployment">
    The two figures are measured separately, so they can differ on the same day. Both tables have `timestamp` at midnight UTC, and the join matches on it.

    ```sql theme={null}
    select
        assets.timestamp,
        assets.price as asset_price,
        tokens.price as token_price
    from `metrics_assets.price_daily` as assets
    join `metrics_tokens.price_daily` as tokens
        on tokens.timestamp = assets.timestamp
        and tokens.token_id = '0xdac17f958d2ee523a2206206994597c13d831ec7-ethereum'
        and tokens.timestamp >= timestamp('2026-07-01')
    where assets.asset_id = 'usdt'
      and assets.timestamp >= timestamp('2026-07-01')
    order by assets.timestamp
    ```
  </Tab>

  <Tab title="Pricing an event">
    The hourly table is keyed on the top of the hour, so `timestamp_trunc` matches an event to it. Bound `block_timestamp` and filter `chain_id` on the transfer side too: that table is billed on what the query reads.

    ```sql theme={null}
    select
        transfers.block_timestamp,
        transfers.transaction_hash,
        cast(transfers.amount_raw as bignumeric) / pow(10, tokens.decimals) * prices.price as amount_usd
    from `facts_tokens.transfers` as transfers
    join `dimensions.tokens` as tokens
        using (token_id)
    join `metrics_tokens.price_hourly` as prices
        on prices.token_id = transfers.token_id
        and prices.timestamp = timestamp_trunc(transfers.block_timestamp, hour)
    where transfers.token_address = '0xdac17f958d2ee523a2206206994597c13d831ec7'
      and transfers.chain_id = 'ethereum'
      and transfers.block_timestamp >= timestamp('2026-08-20')
      and transfers.block_timestamp < timestamp('2026-08-21')
    order by amount_usd desc
    limit 20
    ```
  </Tab>
</Tabs>
