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

# Metrics

> Daily bridge figures per project, app and bridge token.

Transfer volume, fees and revenue, in USD. One row per thing per day, at five grains: project, project and chain, app, app and chain, and bridge token.

## Tables

> [!NOTE]
>
> Daily bridge transfer volumes cover closed UTC days and follow the availability cutoff of the chain for each transfer leg. Canonical volume uses the source chain when a source timestamp is available, otherwise the destination chain.

A tab per grain. [Coverage](https://tokenterminal.com/docs/catalog/bridges.md) shows which apps report which measure.

**Project**

One row per project per day.

<table>
  <thead>
    <tr>
      <th width="330">Table</th>
      <th width="190">Value column</th>
      <th>What it holds</th>
    </tr>
  </thead>

  <tbody>
    <tr><td>`metrics_projects.transfer_volume_daily`</td><td>`transfer_volume`</td><td>USD value of assets moved through the project's bridge transfers, counted once per transfer.</td></tr>
    <tr><td>`metrics_projects.fees_daily`</td><td>`fees`</td><td>Total fees paid by users.</td></tr>
    <tr><td>`metrics_projects.revenue_daily`</td><td>`revenue`</td><td>Fees retained by the protocol.</td></tr>
  </tbody>
</table>

**Project × chain**

One row per project and chain per day. The two directional columns read one set of transfers from opposite ends, so `transfer_volume` is the one that counts each transfer once.

<table>
  <thead>
    <tr>
      <th width="330">Table</th>
      <th width="190">Value column</th>
      <th>What it holds</th>
    </tr>
  </thead>

  <tbody>
    <tr><td>`metrics_projects_by_chain.transfer_volume_daily`</td><td>`transfer_volume`</td><td>USD value of assets moved through the project's bridge transfers, counted once per transfer.</td></tr>
    <tr><td>`metrics_projects_by_chain.transfer_volume_source_daily`</td><td>`transfer_volume_source`</td><td>USD value sent out through the project's bridge transfers, measured on the source chain leg.</td></tr>
    <tr><td>`metrics_projects_by_chain.transfer_volume_destination_daily`</td><td>`transfer_volume_destination`</td><td>USD value received through the project's bridge transfers, measured on the destination chain leg.</td></tr>
    <tr><td>`metrics_projects_by_chain.fees_daily`</td><td>`fees`</td><td>Total fees paid by users.</td></tr>
    <tr><td>`metrics_projects_by_chain.revenue_daily`</td><td>`revenue`</td><td>Fees retained by the protocol.</td></tr>
  </tbody>
</table>

**App**

One row per app per day.

<table>
  <thead>
    <tr>
      <th width="330">Table</th>
      <th width="190">Value column</th>
      <th>What it holds</th>
    </tr>
  </thead>

  <tbody>
    <tr><td>`metrics_apps.transfer_volume_daily`</td><td>`transfer_volume`</td><td>USD value of assets moved through the app's bridge transfers, counted once per transfer.</td></tr>
    <tr><td>`metrics_apps.fees_daily`</td><td>`fees`</td><td>Fees paid by users of the app across every chain it runs on.</td></tr>
    <tr><td>`metrics_apps.revenue_daily`</td><td>`revenue`</td><td>Fees the app retained across every chain it runs on.</td></tr>
  </tbody>
</table>

**App × chain**

One row per app and chain per day. A chain figure takes a direction, and the app's counted-once total sits one grain up on `metrics_apps.transfer_volume_daily`.

<table>
  <thead>
    <tr>
      <th width="330">Table</th>
      <th width="190">Value column</th>
      <th>What it holds</th>
    </tr>
  </thead>

  <tbody>
    <tr><td>`metrics_apps_by_chain.transfer_volume_source_daily`</td><td>`transfer_volume_source`</td><td>USD value sent out through the app's bridge transfers, measured on the source chain leg.</td></tr>
    <tr><td>`metrics_apps_by_chain.transfer_volume_destination_daily`</td><td>`transfer_volume_destination`</td><td>USD value received through the app's bridge transfers, measured on the destination chain leg.</td></tr>
  </tbody>
</table>

**Bridge token**

One row per token and app per day. `token_id` is the key from `dimensions.tokens`, and `chain_id` names the chain the leg was measured on.

<table>
  <thead>
    <tr>
      <th width="330">Table</th>
      <th width="190">Value column</th>
      <th>What it holds</th>
    </tr>
  </thead>

  <tbody>
    <tr><td>`metrics_bridge_tokens.transfer_volume_source_daily`</td><td>`transfer_volume_source`</td><td>USD value of the token sent out through a bridge, measured on the source chain leg.</td></tr>
    <tr><td>`metrics_bridge_tokens.transfer_volume_destination_daily`</td><td>`transfer_volume_destination`</td><td>USD value of the token received through a bridge, measured on the destination chain leg.</td></tr>
  </tbody>
</table>

## Sample queries

**Projects by volume**

`transfer_volume` is in USD and counts each transfer once, whichever pair of chains it crossed, so one project's figure compares with another's. `dimensions.projects` supplies the display name on `project_id`.

```sql theme={null}
select
    daily.project_id,
    projects.name,
    daily.transfer_volume
from `metrics_projects.transfer_volume_daily` as daily
left join `dimensions.projects` as projects
    using (project_id)
where daily.timestamp = timestamp('2026-08-01')
order by daily.transfer_volume desc
limit 25
```

**One project's chain split**

The counted-once figure and the two directional legs are three tables, joined on `chain_id` and `timestamp` and bounded on each side. `full join` keeps a chain that only received on a day it sent nothing.

```sql theme={null}
with counted_once as (
    select timestamp, chain_id, transfer_volume
    from `metrics_projects_by_chain.transfer_volume_daily`
    where project_id = 'layerzero'
      and timestamp >= timestamp('2026-08-01')
),

leaving as (
    select timestamp, chain_id, transfer_volume_source
    from `metrics_projects_by_chain.transfer_volume_source_daily`
    where project_id = 'layerzero'
      and timestamp >= timestamp('2026-08-01')
),

arriving as (
    select timestamp, chain_id, transfer_volume_destination
    from `metrics_projects_by_chain.transfer_volume_destination_daily`
    where project_id = 'layerzero'
      and timestamp >= timestamp('2026-08-01')
)

select
    coalesce(counted_once.timestamp, leaving.timestamp, arriving.timestamp) as timestamp,
    coalesce(counted_once.chain_id, leaving.chain_id, arriving.chain_id) as chain_id,
    counted_once.transfer_volume,
    leaving.transfer_volume_source,
    arriving.transfer_volume_destination
from counted_once
full join leaving
    using (timestamp, chain_id)
full join arriving
    using (timestamp, chain_id)
order by timestamp, chain_id
```

**Apps by volume**

The app grain splits a project into its bridge versions, so `layerzero-v1` and `layerzero-v2` rank as two rows. `dimensions.apps` has the display name and the project each version belongs to.

```sql theme={null}
select
    daily.app_id,
    apps.name,
    apps.project_id,
    daily.transfer_volume
from `metrics_apps.transfer_volume_daily` as daily
left join `dimensions.apps` as apps
    using (app_id)
where daily.timestamp = timestamp('2026-08-01')
order by daily.transfer_volume desc
limit 25
```

**One app, by chain**

Each direction is its own table, so one row per chain with both is a join on `chain_id` and `timestamp`. A chain reads high on `transfer_volume_source` when it is where value leaves from, and high on `transfer_volume_destination` when it is where value lands.

```sql theme={null}
with leaving as (
    select timestamp, chain_id, transfer_volume_source
    from `metrics_apps_by_chain.transfer_volume_source_daily`
    where app_id = 'layerzero-v2'
      and timestamp >= timestamp('2026-08-01')
),

arriving as (
    select timestamp, chain_id, transfer_volume_destination
    from `metrics_apps_by_chain.transfer_volume_destination_daily`
    where app_id = 'layerzero-v2'
      and timestamp >= timestamp('2026-08-01')
)

select
    coalesce(leaving.timestamp, arriving.timestamp) as timestamp,
    coalesce(leaving.chain_id, arriving.chain_id) as chain_id,
    leaving.transfer_volume_source,
    arriving.transfer_volume_destination
from leaving
full join arriving
    using (timestamp, chain_id)
order by timestamp, chain_id
```

**One token, both directions**

`token_id` names the token on one chain, so USDC on Ethereum and USDC on Base are two keys and this reads the Ethereum one. The two directions join on `token_id` and `timestamp`, bounded on each side.

```sql theme={null}
with leaving as (
    select timestamp, transfer_volume_source
    from `metrics_bridge_tokens.transfer_volume_source_daily`
    where token_id = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48-ethereum'
      and timestamp >= timestamp('2026-08-01')
),

arriving as (
    select timestamp, transfer_volume_destination
    from `metrics_bridge_tokens.transfer_volume_destination_daily`
    where token_id = '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48-ethereum'
      and timestamp >= timestamp('2026-08-01')
)

select
    coalesce(leaving.timestamp, arriving.timestamp) as timestamp,
    leaving.transfer_volume_source,
    arriving.transfer_volume_destination
from leaving
full join arriving
    using (timestamp)
order by timestamp
```

**Tokens leaving one chain**

The token grain has `app_id`, so one token bridged by two apps is two rows and a token total is a group by on `token_id`. `dimensions.tokens` supplies the symbol.

```sql theme={null}
select
    daily.token_id,
    tokens.symbol,
    sum(daily.transfer_volume_source) as transfer_volume_source
from `metrics_bridge_tokens.transfer_volume_source_daily` as daily
left join `dimensions.tokens` as tokens
    using (token_id)
where daily.timestamp = timestamp('2026-08-01')
  and daily.chain_id = 'ethereum'
group by daily.token_id, tokens.symbol
order by transfer_volume_source desc
limit 25
```


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