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

# Aptos

> Standardized Aptos tables from the chain's 2022 mainnet launch.

`aptos` holds the standardized Aptos tables, following the Aptos-style schema documented in [the family overview](https://tokenterminal.com/docs/catalog/chain-verticals/move/index.md) exactly, with no differences. The same schema applies to Movement, which uses the same tables.

A **module** is a published unit of Move code, the equivalent of a contract elsewhere. A **resource** is a piece of data stored under an account, such as its balance of a particular coin; the changes tables record what a transaction wrote to those.

Above the raw tables sits the rest of the catalog, and Aptos shows up in two parts of it: the list of tokens we know about with their daily prices, and the tokenized assets issued on the chain. [Real-world assets](https://tokenterminal.com/docs/catalog/real-world-assets/index.md) and [Stablecoins](https://tokenterminal.com/docs/catalog/stablecoins/index.md) cover the tokenized assets and their daily tables. [Tokens](https://tokenterminal.com/docs/catalog/tokens/index.md) covers the token list and the daily price table.

## Tables

<table>
  <thead>
    <tr>
      <th width="150">Table</th>
      <th width="90">Since</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>`blocks`</td>
      <td>2022-10</td>
      <td>One row per block, with the first and last transaction version in it.</td>
    </tr>

    <tr>
      <td>`transactions`</td>
      <td>2022-10</td>
      <td>One row per transaction version, keyed on `version`.</td>
    </tr>

    <tr>
      <td>`events`</td>
      <td>2022-10</td>
      <td>One row per event a transaction emitted.</td>
    </tr>

    <tr>
      <td>`changes`</td>
      <td>2022-10</td>
      <td>One row per state change a transaction wrote.</td>
    </tr>

    <tr>
      <td>`resources`</td>
      <td>2022-10</td>
      <td>One row per account resource write or delete.</td>
    </tr>

    <tr>
      <td>`modules`</td>
      <td>2022-10</td>
      <td>One row per Move module publish or update.</td>
    </tr>

    <tr>
      <td>`table_items`</td>
      <td>2022-10</td>
      <td>One row per onchain table item write or delete.</td>
    </tr>
  </tbody>
</table>

`resources`, `modules` and `table_items` are slices of `changes`: the writes that touched data stored under an account, the ones that published or upgraded code, and the ones that wrote to a contract's own key-value store.

> [!WARNING]
>
> Every table except `blocks` splits by day on `block_timestamp`, and `blocks` on `timestamp`. Bound that column in every query; without a bound the query reads the whole table.

**blocks**

A block is a batch of transactions added to the chain. Aptos also numbers every transaction it has ever run, and that number is the transaction's version, so each block covers a range of versions. `blocks` contains one row per block, with the first and last version in it.

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

  <tbody>
    <tr>
      <td>`timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time the block was produced. Partition column.</td>
    </tr>

    <tr>
      <td>`block_height`</td>
      <td>INT64</td>
      <td>The block height.</td>
    </tr>

    <tr>
      <td>`first_version`</td>
      <td>STRING</td>
      <td>The first transaction version in the block.</td>
    </tr>

    <tr>
      <td>`last_version`</td>
      <td>STRING</td>
      <td>The last transaction version in the block.</td>
    </tr>

    <tr>
      <td>`block_hash`</td>
      <td>STRING</td>
      <td>The hash of the block.</td>
    </tr>
  </tbody>
</table>

**Daily blocks and version range**

**Count blocks per day and the version range they cover.**

```sql theme={null}
select
    date(timestamp) as day,
    count(*) as blocks,
    min(first_version) as first_version,
    max(last_version) as last_version
from `aptos.blocks`
where timestamp >= timestamp('2026-08-20')
  and timestamp < timestamp('2026-08-21')
group by day
```

**transactions**

Not every transaction comes from a user: the chain writes its own bookkeeping entries into the same numbered sequence. `transactions` contains one row per transaction, identified by its version number, whichever kind it is: a user transaction, a block metadata entry, or a state checkpoint. The `type` column says which.

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

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing block. Partition column.</td>
    </tr>

    <tr>
      <td>`block_height`</td>
      <td>INT64</td>
      <td>The height of the containing block.</td>
    </tr>

    <tr>
      <td>`hash`</td>
      <td>STRING</td>
      <td>The hash of the transaction.</td>
    </tr>

    <tr>
      <td>`timestamp`</td>
      <td>STRING</td>
      <td>The onchain transaction timestamp, in microseconds.</td>
    </tr>

    <tr>
      <td>`accumulator_root_hash`</td>
      <td>STRING</td>
      <td>The accumulator root hash after the transaction.</td>
    </tr>

    <tr>
      <td>`epoch`</td>
      <td>STRING</td>
      <td>The epoch of the transaction.</td>
    </tr>

    <tr>
      <td>`event_root_hash`</td>
      <td>STRING</td>
      <td>The root hash of the transaction's events.</td>
    </tr>

    <tr>
      <td>`expiration_timestamp_secs`</td>
      <td>STRING</td>
      <td>The expiration time set by the sender, in seconds.</td>
    </tr>

    <tr>
      <td>`failed_proposer_indices`</td>
      <td>ARRAY\<INT64></td>
      <td>The indices of proposers that failed in the round.</td>
    </tr>

    <tr>
      <td>`gas_unit_price`</td>
      <td>STRING</td>
      <td>The gas unit price, in octas.</td>
    </tr>

    <tr>
      <td>`gas_used`</td>
      <td>STRING</td>
      <td>The gas units consumed.</td>
    </tr>

    <tr>
      <td>`id`</td>
      <td>STRING</td>
      <td>The identifier of block metadata transactions.</td>
    </tr>

    <tr>
      <td>`max_gas_amount`</td>
      <td>STRING</td>
      <td>The gas limit set by the sender.</td>
    </tr>

    <tr>
      <td>`previous_block_votes_bitvec`</td>
      <td>ARRAY\<INT64></td>
      <td>The vote bitvector for the previous block.</td>
    </tr>

    <tr>
      <td>`proposer`</td>
      <td>STRING</td>
      <td>The proposer of the block, for block metadata transactions.</td>
    </tr>

    <tr>
      <td>`round`</td>
      <td>STRING</td>
      <td>The consensus round.</td>
    </tr>

    <tr>
      <td>`sender`</td>
      <td>STRING</td>
      <td>The sending account.</td>
    </tr>

    <tr>
      <td>`sequence_number`</td>
      <td>STRING</td>
      <td>The sender's sequence number.</td>
    </tr>

    <tr>
      <td>`state_change_hash`</td>
      <td>STRING</td>
      <td>The hash of the transaction's state changes.</td>
    </tr>

    <tr>
      <td>`state_checkpoint_hash`</td>
      <td>STRING</td>
      <td>The state checkpoint hash, when present.</td>
    </tr>

    <tr>
      <td>`success`</td>
      <td>BOOL</td>
      <td>Whether the transaction succeeded.</td>
    </tr>

    <tr>
      <td>`type`</td>
      <td>STRING</td>
      <td>The transaction type, such as user or block metadata.</td>
    </tr>

    <tr>
      <td>`version`</td>
      <td>STRING</td>
      <td>The global transaction version, the identifier used everywhere else.</td>
    </tr>

    <tr>
      <td>`vm_status`</td>
      <td>STRING</td>
      <td>The VM execution status.</td>
    </tr>

    <tr>
      <td>`signature_type`</td>
      <td>STRING</td>
      <td>The signature scheme used.</td>
    </tr>

    <tr>
      <td>`signature_public_key`</td>
      <td>STRING</td>
      <td>The signing public key.</td>
    </tr>

    <tr>
      <td>`signature`</td>
      <td>STRING</td>
      <td>The transaction signature.</td>
    </tr>

    <tr>
      <td>`payload`</td>
      <td>JSON</td>
      <td>The full transaction payload.</td>
    </tr>

    <tr>
      <td>`payload_function`</td>
      <td>STRING</td>
      <td>The entry function called, as address::module::function.</td>
    </tr>

    <tr>
      <td>`payload_type`</td>
      <td>STRING</td>
      <td>The payload type.</td>
    </tr>

    <tr>
      <td>`payload_type_arguments`</td>
      <td>JSON</td>
      <td>The generic type arguments of the call.</td>
    </tr>

    <tr>
      <td>`payload_arguments`</td>
      <td>JSON</td>
      <td>The arguments of the call.</td>
    </tr>
  </tbody>
</table>

**Daily success rate**

**Count daily Aptos transactions and their success rate over one week.**

```sql theme={null}
select
    timestamp_trunc(block_timestamp, day) as day,
    count(*) as transactions,
    countif(success) as successful
from `aptos.transactions`
where block_timestamp >= timestamp('2026-08-16')
  and block_timestamp < timestamp('2026-08-23')
group by day
order by day
```

**events**

An event is a note that published code writes when something happens inside it: a transfer, a swap, a deposit. `events` contains one row per event a transaction produced.

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

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing block. Partition column.</td>
    </tr>

    <tr>
      <td>`block_height`</td>
      <td>INT64</td>
      <td>The height of the containing block.</td>
    </tr>

    <tr>
      <td>`sequence_number`</td>
      <td>STRING</td>
      <td>The sequence number of the event in its stream.</td>
    </tr>

    <tr>
      <td>`transaction_hash`</td>
      <td>STRING</td>
      <td>The hash of the emitting transaction.</td>
    </tr>

    <tr>
      <td>`event_type`</td>
      <td>STRING</td>
      <td>The Move type of the event.</td>
    </tr>

    <tr>
      <td>`event_index`</td>
      <td>INT64</td>
      <td>The position of the event within the transaction.</td>
    </tr>

    <tr>
      <td>`event_guid_account_address`</td>
      <td>STRING</td>
      <td>The account address of the event stream.</td>
    </tr>

    <tr>
      <td>`event_guid_creation_number`</td>
      <td>INT64</td>
      <td>The creation number of the event stream.</td>
    </tr>

    <tr>
      <td>`data`</td>
      <td>JSON</td>
      <td>The event payload.</td>
    </tr>
  </tbody>
</table>

**Events by type**

**Count events by type on one day.**

```sql theme={null}
select
    event_type,
    count(*) as events
from `aptos.events`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by event_type
order by events desc
limit 20
```

**changes**

Everything a transaction actually altered on the chain is recorded here. `changes` contains one row per alteration, of any kind. The tables that follow are slices of this one.

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

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing block. Partition column.</td>
    </tr>

    <tr>
      <td>`block_height`</td>
      <td>INT64</td>
      <td>The height of the containing block.</td>
    </tr>

    <tr>
      <td>`transaction_hash`</td>
      <td>STRING</td>
      <td>The hash of the writing transaction.</td>
    </tr>

    <tr>
      <td>`changes_index`</td>
      <td>INT64</td>
      <td>The position of the change within the transaction.</td>
    </tr>

    <tr>
      <td>`changes_type`</td>
      <td>STRING</td>
      <td>The change type, such as write resource or delete resource.</td>
    </tr>

    <tr>
      <td>`changes_address`</td>
      <td>STRING</td>
      <td>The account address the change applies to.</td>
    </tr>

    <tr>
      <td>`data_type`</td>
      <td>STRING</td>
      <td>The Move type of the changed data.</td>
    </tr>

    <tr>
      <td>`data`</td>
      <td>JSON</td>
      <td>The changed data.</td>
    </tr>

    <tr>
      <td>`changes`</td>
      <td>JSON</td>
      <td>The raw change record.</td>
    </tr>
  </tbody>
</table>

**Changes by type**

**Count changes by type on one day.**

```sql theme={null}
select
    changes_type,
    count(*) as changes
from `aptos.changes`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by changes_type
order by changes desc
```

**resources**

`resources` is the part of `changes` that touched data stored under an account, a coin balance for instance. One row per write or delete.

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

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing block. Partition column.</td>
    </tr>

    <tr>
      <td>`block_height`</td>
      <td>INT64</td>
      <td>The height of the containing block.</td>
    </tr>

    <tr>
      <td>`transaction_hash`</td>
      <td>STRING</td>
      <td>The hash of the writing transaction.</td>
    </tr>

    <tr>
      <td>`changes_type`</td>
      <td>STRING</td>
      <td>The change type.</td>
    </tr>

    <tr>
      <td>`changes_index`</td>
      <td>INT64</td>
      <td>The position of the change within the transaction.</td>
    </tr>

    <tr>
      <td>`changes_address`</td>
      <td>STRING</td>
      <td>The account address the change applies to.</td>
    </tr>

    <tr>
      <td>`resource_address`</td>
      <td>STRING</td>
      <td>The address of the resource.</td>
    </tr>

    <tr>
      <td>`data`</td>
      <td>JSON</td>
      <td>The resource contents after the change.</td>
    </tr>

    <tr>
      <td>`data_type`</td>
      <td>STRING</td>
      <td>The Move type of the resource.</td>
    </tr>

    <tr>
      <td>`state_key_hash`</td>
      <td>STRING</td>
      <td>The state key hash of the resource slot.</td>
    </tr>
  </tbody>
</table>

**Most-written resource types**

**Rank resource types by writes on one day.**

```sql theme={null}
select
    data_type,
    count(*) as writes
from `aptos.resources`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
group by data_type
order by writes desc
limit 20
```

**modules**

`modules` contains one row per time Move code was published or upgraded, along with the functions and data types that code exposes.

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

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing block. Partition column.</td>
    </tr>

    <tr>
      <td>`block_height`</td>
      <td>INT64</td>
      <td>The height of the containing block.</td>
    </tr>

    <tr>
      <td>`transaction_hash`</td>
      <td>STRING</td>
      <td>The hash of the publishing transaction.</td>
    </tr>

    <tr>
      <td>`changes_type`</td>
      <td>STRING</td>
      <td>The change type.</td>
    </tr>

    <tr>
      <td>`changes_index`</td>
      <td>INT64</td>
      <td>The position of the change within the transaction.</td>
    </tr>

    <tr>
      <td>`changes_address`</td>
      <td>STRING</td>
      <td>The account address the change applies to.</td>
    </tr>

    <tr>
      <td>`module_address`</td>
      <td>STRING</td>
      <td>The address the module lives under.</td>
    </tr>

    <tr>
      <td>`module_name`</td>
      <td>STRING</td>
      <td>The name of the module.</td>
    </tr>

    <tr>
      <td>`exposed_functions`</td>
      <td>JSON</td>
      <td>The public functions of the module.</td>
    </tr>

    <tr>
      <td>`friends`</td>
      <td>JSON</td>
      <td>The friend modules.</td>
    </tr>

    <tr>
      <td>`structs`</td>
      <td>JSON</td>
      <td>The struct definitions of the module.</td>
    </tr>

    <tr>
      <td>`bytecode`</td>
      <td>STRING</td>
      <td>The compiled module bytecode.</td>
    </tr>

    <tr>
      <td>`state_key_hash`</td>
      <td>STRING</td>
      <td>The state key hash of the module slot.</td>
    </tr>
  </tbody>
</table>

**Daily module publishes**

**Count module publishes and upgrades per day over one week.**

```sql theme={null}
select
    date(block_timestamp) as day,
    count(*) as modules_published
from `aptos.modules`
where block_timestamp >= timestamp('2026-08-16')
  and block_timestamp < timestamp('2026-08-23')
group by day
order by day
```

**table\_items**

Move code can keep its own key-value store on the chain, and each entry in one is a table item. `table_items` contains one row per entry written or deleted.

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

  <tbody>
    <tr>
      <td>`block_timestamp`</td>
      <td>TIMESTAMP</td>
      <td>The time of the containing block. Partition column.</td>
    </tr>

    <tr>
      <td>`block_height`</td>
      <td>INT64</td>
      <td>The height of the containing block.</td>
    </tr>

    <tr>
      <td>`transaction_hash`</td>
      <td>STRING</td>
      <td>The hash of the writing transaction.</td>
    </tr>

    <tr>
      <td>`changes_type`</td>
      <td>STRING</td>
      <td>The change type.</td>
    </tr>

    <tr>
      <td>`changes_index`</td>
      <td>INT64</td>
      <td>The position of the change within the transaction.</td>
    </tr>

    <tr>
      <td>`data`</td>
      <td>JSON</td>
      <td>The raw item record.</td>
    </tr>

    <tr>
      <td>`handle`</td>
      <td>STRING</td>
      <td>The handle of the table.</td>
    </tr>

    <tr>
      <td>`key`</td>
      <td>STRING</td>
      <td>The key of the item.</td>
    </tr>

    <tr>
      <td>`value`</td>
      <td>STRING</td>
      <td>The value of the item after the change.</td>
    </tr>

    <tr>
      <td>`state_key_hash`</td>
      <td>STRING</td>
      <td>The state key hash of the item slot.</td>
    </tr>
  </tbody>
</table>

**Daily table item writes**

**Count table item writes and deletes per day over one week.**

```sql theme={null}
select
    date(block_timestamp) as day,
    count(*) as items
from `aptos.table_items`
where block_timestamp >= timestamp('2026-08-16')
  and block_timestamp < timestamp('2026-08-23')
group by day
order by day
```

## Sample queries

**Entry functions by usage**

**Rank entry functions by user transactions on one day.**

```sql theme={null}
select
    payload_function,
    count(*) as transactions
from `aptos.transactions`
where block_timestamp >= timestamp('2026-08-20')
  and block_timestamp < timestamp('2026-08-21')
  and type = 'user_transaction'
group by payload_function
order by transactions desc
limit 20
```

**Tokenized assets by market cap**

**Rank the tokenized assets deployed on Aptos by circulating market cap.**

```sql theme={null}
select
    assets.symbol,
    assets.asset_type,
    daily.market_cap_circulating
from `metrics_asset_tokens.market_cap_circulating_daily` as daily
join `dimensions.asset_tokens` as deployments
    using (asset_token_id)
join `dimensions.assets` as assets
    using (asset_id)
where daily.timestamp >= timestamp('2026-08-22')
  and daily.timestamp < timestamp('2026-08-23')
  and deployments.chain_id = 'aptos'
order by daily.market_cap_circulating desc
limit 20
```

**Priced tokens**

**List the Aptos tokens that had a daily price over one week.**

```sql theme={null}
with priced as (
    select
        token_id,
        avg(price) as avg_price,
        count(*) as price_days
    from `metrics_tokens.price_daily`
    where timestamp >= timestamp('2026-08-16')
      and timestamp < timestamp('2026-08-23')
      and chain_id = 'aptos'
    group by token_id
)

select
    tokens.symbol,
    tokens.name,
    priced.avg_price,
    priced.price_days
from priced
join `dimensions.tokens` as tokens using (token_id)
order by priced.avg_price desc
limit 20
```


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