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

> App names, the project that runs each one, and market sectors.

`dimensions.apps` holds one row per app: one deployed version of a protocol that a project runs, such as `uniswap-v3` or `hyperliquid-spot`. Rows come from the registry we author by hand, so a row exists because somebody wrote it down, not because we detected activity. A project can run several apps; [`dimensions.projects`](/docs/catalog/projects/registry) holds the project side.

## Columns

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

  <tbody>
    <tr>
      <td><code>app\_id</code></td>
      <td><code>STRING</code></td>
      <td>Identifier of the app. Every table that mentions an app joins on this.</td>
    </tr>

    <tr>
      <td><code>project\_id</code></td>
      <td><code>STRING</code></td>
      <td>Project that runs the app. Joins <code>dimensions.projects</code>.</td>
    </tr>

    <tr>
      <td><code>name</code></td>
      <td><code>STRING</code></td>
      <td>Display name.</td>
    </tr>

    <tr>
      <td><code>market\_sectors</code></td>
      <td><code>ARRAY\<STRING></code></td>
      <td>Every market sector tag the app carries.</td>
    </tr>

    <tr>
      <td><code>primary\_market\_sector</code></td>
      <td><code>STRING</code></td>
      <td>The first element of <code>market\_sectors</code>. One value per row.</td>
    </tr>

    <tr>
      <td><code>created\_at</code></td>
      <td><code>TIMESTAMP</code></td>
      <td>When the app was added to the registry.</td>
    </tr>
  </tbody>
</table>

## Sample queries

<Tabs>
  <Tab title="Apps for one project">
    **List every app one project runs.**

    ```sql theme={null}
    select
        app_id,
        name,
        market_sectors,
        created_at
    from `dimensions.apps`
    where project_id = 'hyperliquid'
    order by app_id
    ```
  </Tab>

  <Tab title="Apps by sector">
    **Count apps per primary market sector.**

    ```sql theme={null}
    select
        primary_market_sector,
        count(*) as apps
    from `dimensions.apps`
    group by primary_market_sector
    order by apps desc
    ```
  </Tab>

  <Tab title="Apps with their project">
    **List the apps in one sector beside the project behind each.**

    ```sql theme={null}
    select
        apps.app_id,
        apps.name,
        projects.name as project_name
    from `dimensions.apps` as apps
    join `dimensions.projects` as projects
        using (project_id)
    where apps.primary_market_sector = 'lending'
    order by project_name, apps.app_id
    ```
  </Tab>
</Tabs>

## Notes

`market_sectors` is a list, so joining through `unnest(market_sectors)` yields one row per tag and counts an app once for every tag it carries. Group by `primary_market_sector` to keep one row per app. [Projects ▸ Registry](/docs/catalog/projects/registry) carries the same rule for projects.
