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

# Registry

> Bridge identity: the projects, the deployed versions, and the tokens they move.

The identity tables behind every bridge figure. Every fact and metric joins to one of them, and [Coverage](https://tokenterminal.com/docs/catalog/bridges.md) introduces each grain.

## Tables

**Projects**

One row per project in the catalog.

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

  <tbody>
    <tr><td>`project_id`</td><td>STRING</td><td>The project, such as `aave`.</td></tr>
    <tr><td>`slug`</td><td>STRING</td><td>The project's key in Token Terminal page URLs. It differs from `project_id` where the page URL is hyphenated (`redstone-chain` for `redstonechain`).</td></tr>
    <tr><td>`url`</td><td>STRING</td><td>The project's page on the Token Terminal Explorer.</td></tr>
    <tr><td>`name`</td><td>STRING</td><td>Display name.</td></tr>
    <tr><td>`symbol`</td><td>STRING</td><td>Ticker of the project's token, where it has one.</td></tr>
    <tr><td>`logo`</td><td>STRING</td><td>Public URL of the project logo, a PNG. Its `?logo_hash=` suffix changes whenever the image does. Null for a project whose image was never uploaded.</td></tr>
    <tr><td>`description`</td><td>STRUCT</td><td>The project copy: `what` the project is, `who` it serves and `how` it works.</td></tr>
    <tr><td>`links`</td><td>ARRAY\<STRUCT></td><td>The project's links as `type` and `url` pairs (website, x, docs, github). `type` is the label as written, so `twitter` and `x` both occur.</td></tr>
    <tr><td>`market_sectors`</td><td>ARRAY\<STRING></td><td>Every market sector the project belongs to, as tag ids, primary first. Unnesting it yields one row per sector.</td></tr>
    <tr><td>`primary_market_sector`</td><td>STRING</td><td>The market sector the project is listed under: the first element of `market_sectors`. One value per row.</td></tr>
    <tr><td>`listing_date`</td><td>TIMESTAMP</td><td>When the project was listed on Token Terminal.</td></tr>
    <tr><td>`coingecko_id`</td><td>STRING</td><td>The project token's CoinGecko id.</td></tr>
    <tr><td>`coinmarketcap_id`</td><td>STRING</td><td>The project token's CoinMarketCap id.</td></tr>
  </tbody>
</table>

**Apps**

One row per app in the catalog.

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

  <tbody>
    <tr><td>`app_id`</td><td>STRING</td><td>The app, such as `aave-v3`.</td></tr>
    <tr><td>`project_id`</td><td>STRING</td><td>The project operating it.</td></tr>
    <tr><td>`name`</td><td>STRING</td><td>Display name.</td></tr>
    <tr><td>`market_sectors`</td><td>ARRAY\<STRING></td><td>Every sector the app is tagged with.</td></tr>
    <tr><td>`primary_market_sector`</td><td>STRING</td><td>The first of those, for grouping.</td></tr>
    <tr><td>`created_at`</td><td>TIMESTAMP</td><td>When the app was added.</td></tr>
  </tbody>
</table>

**Bridge tokens**

One row per token in the catalog, in `dimensions.tokens`. `token_id` is the key the bridge token grain is built on.

<table>
  <thead>
    <tr>
      <th width="280">Column</th>
      <th width="130">Type</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`token_id`</td>
      <td>`STRING`</td>
      <td>Token identifier: `{token_address}-{chain_id}`.</td>
    </tr>

    <tr>
      <td>`asset_id`</td>
      <td>`STRING`</td>
      <td>The curated asset this token is a deployment of. Empty where no one has matched it.</td>
    </tr>

    <tr>
      <td>`chain_id`</td>
      <td>`STRING`</td>
      <td>Chain the contract is deployed on.</td>
    </tr>

    <tr>
      <td>`token_address`</td>
      <td>`STRING`</td>
      <td>Contract address, lowercase.</td>
    </tr>

    <tr>
      <td>`symbol`</td>
      <td>`STRING`</td>
      <td>Symbol read from the contract, unverified.</td>
    </tr>

    <tr>
      <td>`name`</td>
      <td>`STRING`</td>
      <td>Name read from the contract, unverified.</td>
    </tr>

    <tr>
      <td>`decimals`</td>
      <td>`INT64`</td>
      <td>How many decimal places to move to turn a raw amount into a token amount.</td>
    </tr>

    <tr>
      <td>`created_at`</td>
      <td>`TIMESTAMP`</td>
      <td>When the token launched onchain.</td>
    </tr>

    <tr>
      <td>`bridged`</td>
      <td>`BOOL`</td>
      <td>Whether the deployment is a bridged wrapper. Empty where the token has not been matched to an asset.</td>
    </tr>

    <tr>
      <td>`coingecko_id`</td>
      <td>`STRING`</td>
      <td>Identifier of the same token in the CoinGecko catalogue, for joining our record to a public one.</td>
    </tr>
  </tbody>
</table>

## Sample queries

**Bridge apps**

`market_sectors` is an array, so the section filter reads `'bridges' in unnest(market_sectors)`. An app tagged with several sectors returns one row.

```sql theme={null}
select
    app_id,
    project_id,
    name
from `dimensions.apps`
order by project_id, app_id
```

**Projects behind the bridges**

A project can run several bridge versions, and this returns the project once. `primary_market_sector` is the sector the Explorer lists the project under.

```sql theme={null}
select
    project_id,
    name,
    symbol,
    market_sectors
from `dimensions.projects`
where primary_market_sector = 'bridges'
order by project_id
```

**Tokens one bridge moves**

The token grain is where a bridge's assets are named, and `token_id` joins `dimensions.tokens` for the symbol and the decimals. Bound `timestamp` on the metrics side: this reads one day.

```sql theme={null}
select distinct
    daily.token_id,
    tokens.symbol,
    tokens.decimals,
    daily.chain_id
from `metrics_bridge_tokens.transfer_volume_source_daily` as daily
join `dimensions.tokens` as tokens
    using (token_id)
where daily.app_id = 'circle-cctp-v2'
  and daily.timestamp = timestamp('2026-08-01')
order by tokens.symbol, daily.chain_id
```

**Chains a bridge connects**

The chain pairs a bridge serves are read off the transfers themselves, on `source_chain_id` and `destination_chain_id`. Bound `block_timestamp`: the fact is partitioned on it.

```sql theme={null}
select
    source_chain_id,
    destination_chain_id,
    count(*) as transfers
from `facts_bridge_tokens.transfers`
where app_id = 'layerzero-v2'
  and block_timestamp >= timestamp('2026-08-01')
  and block_timestamp < timestamp('2026-08-02')
group by source_chain_id, destination_chain_id
order by transfers desc
limit 25
```


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