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

> Address, type and label for every account.

The identity table behind an address: the chain it sits on and, where somebody has attributed it, the project that runs it, its type and its label, next to the region, funding and attested country held for it. [Accounts](https://tokenterminal.com/docs/catalog/accounts/index.md) introduces the grain, and [Contracts](https://tokenterminal.com/docs/catalog/contracts/registry.md) has the deployment behind a contract account.

We publish where a wallet is active, where it was funded and, for holders who opted in, the country Coinbase attested for it. Region of activity, unchanged from v1, is a UTC-offset band derived from public transaction timing. Funding source is new. Where we can trace a wallet's incoming transfers to an exchange, custodian, or fiat ramp, we publish which venue funded it, the venue's type, whether that venue address was curated by a person or detected from wallet behavior, a confidence tier of high, medium, or low, how many funding transactions back the tag, and when the funding relationship was first observed. Funding jurisdiction is the country the venue that funded the wallet is registered in and serves, published only where the venue serves a single country. A wallet funded through a regional or global exchange gets a null jurisdiction, because that value describes the venue, not the person who holds the wallet. Neither region nor funding reads a partner's KYC records, and no country is derived from how or when an address transacts, only from where the venue that funded it is registered. Attested country is different in kind: it is the country of residence Coinbase recorded when it verified the account holder, issued as an opt-in attestation the holder can revoke, and we republish it as issued without deriving anything from it.

Region is a property of the address key across its whole `chain_family`, not of one chain, and its evidence comes only from the chains [activity hours](https://tokenterminal.com/docs/catalog/accounts/activity-hours.md) covers: `ethereum`, `base`, `robinhoodchain` and `solana`. No country is ever derived from region: a country comes only from a funding venue's registration, gated to venues that serve a single country, or from an attestation. Every confidence tier describes the strength of one signal, the address's daily rhythm. Region and funding are published per `account_id` for every row, attributed or not, and the [region distribution](https://tokenterminal.com/docs/catalog/accounts/region-distribution.md) report holds region as a distribution across every sender on the chain.

`region` is derived from [activity hours](https://tokenterminal.com/docs/catalog/accounts/activity-hours.md):

1. Sum the address's hourly transaction counts over the trailing 90 complete UTC days, across every chain in its `chain_family`; `n` is the total. Addresses with `n` below 300 get a null `region_confidence`.
2. The trough is the 6-hour window with the smallest share of `n`; its centre hour is `t`. The UTC offset is `round(3.5 - t)`, wrapped to -11..+12, taking 03:30 as the local sleep centre.
3. The band is the one of seven that contains the offset.
4. Depth `d` = `1 - (trough share / 0.25)`; night share is the share in the 12 hours centred on the trough.
5. `high` needs `n >= 3000`, `d >= 0.70`, night `<= 0.25`; `medium` needs `n >= 1000`, `d >= 0.50`, night `<= 0.30`; `low` needs `n >= 300`, `d >= 0.30`, night `<= 0.35`; otherwise `region` and `region_confidence` are null. A second trough within 10% of the first caps confidence at `low`.

An address has a `region` once its trailing activity clears the evidence floor. On a labelled row that describes where a venue or operator runs, and on an unlabelled wallet where that wallet is active.

A global venue's wallets move on its users' hours across every band, so its `region` reflects where its users are, aggregated, and its `region_confidence` often stays null. The hit rate is read against venues whose operations sit in one band.

[Activity coverage](https://tokenterminal.com/docs/catalog/accounts/activity-coverage.md) publishes the share of each day's active senders that are attributed.

`funding_venue_project_id` on [Funding](https://tokenterminal.com/docs/catalog/accounts/funding.md) is derived from [venue edges](https://tokenterminal.com/docs/catalog/accounts/venue-edges.md): the venue is the earliest edge's venue, and a wallet whose edges split evenly across venues gets a null venue instead.

Confidence is set by how many venues a wallet has edges with, and how those edges were found. `high` is one venue, funded through a curated deposit anchor. `medium` is one venue funded through a detected deposit address only, or two venues where the earliest edge was curated. `low` is two venues where the earliest edge was detected. Three or more venues, or two of comparable weight, get a null tier.

`funding_jurisdiction` on Venues is set only where a venue clears three facts together: its `operating_scope` is `single_country`, its `onboarding_scope` is `residents_only`, and its licence countries and entity countries agree on that one country, with no licence row and no funding wallet left without a country. `gate_reason` on Venues names which of the three failed, or `qualifies`.

## Tables

**Accounts**

One row per address the label registry attributes or any accounts fact holds a row for. The label columns are null where nobody has attributed the address. Join on `account_id`, or on `address` and `chain_id`; `attested_country` fills on every EVM chain of an attested address.

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

  <tbody>
    <tr>
      <td>`account_id`</td>
      <td>`STRING`</td>
      <td>Account as one key: `{address}-{chain_id}`. The key that joins `dimensions.contracts` and `dimensions.tokens` directly.</td>
    </tr>

    <tr>
      <td>`chain_id`</td>
      <td>`STRING`</td>
      <td>Chain the address is on. The same address on two chains is two different accounts, so an address identifies a row only with this beside it.</td>
    </tr>

    <tr>
      <td>`address`</td>
      <td>`STRING`</td>
      <td>The address, spelled the way its chain spells it: lowercase on EVM and Starknet, base58 and case-sensitive on Solana and Tron. Lowercase an EVM address copied from an explorer before matching it here; the [balance functions](https://tokenterminal.com/docs/catalog/tokens/balances.md) lowercase the address they are handed.</td>
    </tr>

    <tr>
      <td>`project_id`</td>
      <td>`STRING`</td>
      <td>Project the address is attributed to. Joins `dimensions.projects` for the name and market sector.</td>
    </tr>

    <tr>
      <td>`contract_name`</td>
      <td>`STRING`</td>
      <td>Label for the address as the attributing project names it, such as `Factory` or `USDC-WETH pool`.</td>
    </tr>

    <tr>
      <td>`account_type`</td>
      <td>`STRING`</td>
      <td>`eoa` or `smartcontract`, and null where nobody has determined it, so test it with `is null` rather than `= ''`. Says nothing about whether the owner holds the address custodially.</td>
    </tr>

    <tr>
      <td>`parent_address`</td>
      <td>`STRING`</td>
      <td>For a factory-emitted address, the factory that emitted it.</td>
    </tr>

    <tr>
      <td>`label_source`</td>
      <td>`STRING`</td>
      <td>`curated` for an attribution a person authored, `factory_derived` for an address a known factory emitted. Null where nobody has attributed the address. Of the attributed rows most are factory derived; filter to `curated` for the addresses someone has looked at.</td>
    </tr>

    <tr>
      <td>`region`</td>
      <td>`STRING`</td>
      <td>One of seven UTC-offset bands: `utc-11..-9`, `utc-8..-5`, `utc-4..-2`, `utc-1..+2`, `utc+3..+6`, `utc+7..+9`, `utc+10..+12`. Null when `region_confidence` is null.</td>
    </tr>

    <tr>
      <td>`region_confidence`</td>
      <td>`STRING`</td>
      <td>`high`, `medium` or `low`, from the thresholds behind `region`, and null where `region` is null.</td>
    </tr>

    <tr>
      <td>`region_evidence_txs`</td>
      <td>`INT64`</td>
      <td>Transactions behind the band: `n`, the trailing 90-day total the `region` calculation summed across the address's chain family.</td>
    </tr>

    <tr>
      <td>`funding_venue_project_id`</td>
      <td>`STRING`</td>
      <td>Venue that funded the account, from [Funding](https://tokenterminal.com/docs/catalog/accounts/funding.md). Null where the account has no funding edge, or where its edges split across venues.</td>
    </tr>

    <tr>
      <td>`funding_venue_type`</td>
      <td>`STRING`</td>
      <td>`cex` or `fiat-ramps`, from the Venues tab above. Null iff `funding_venue_project_id` is null.</td>
    </tr>

    <tr>
      <td>`funding_venue_source`</td>
      <td>`STRING`</td>
      <td>`curated` for an edge to a registry anchor, `detected` for an edge through a detected deposit address. Null iff `funding_venue_project_id` is null.</td>
    </tr>

    <tr>
      <td>`funding_confidence`</td>
      <td>`STRING`</td>
      <td>`high`, `medium` or `low`, from the same tiers as [Funding](https://tokenterminal.com/docs/catalog/accounts/funding.md). Null iff `funding_venue_project_id` is null.</td>
    </tr>

    <tr>
      <td>`funding_evidence_edges`</td>
      <td>`INT64`</td>
      <td>First-contact edges behind the tag. `0` where the account has no funding row, like `region_evidence_txs`.</td>
    </tr>

    <tr>
      <td>`funding_first_edge_at`</td>
      <td>`TIMESTAMP`</td>
      <td>Earliest funding edge, from [Funding](https://tokenterminal.com/docs/catalog/accounts/funding.md). Null where the account has no funding row.</td>
    </tr>

    <tr>
      <td>`funding_jurisdiction`</td>
      <td>`STRING`</td>
      <td>ISO 3166-1 alpha-2 of the funding venue, from the Venues tab above. Null unless the venue passes the jurisdiction gate.</td>
    </tr>

    <tr>
      <td>`attested_country`</td>
      <td>`STRING`</td>
      <td>ISO 3166-1 alpha-2 country of residence Coinbase attested for the address, from [Attested country](https://tokenterminal.com/docs/catalog/accounts/attested-country.md). Filled on every row whose chain is EVM, since the attestation applies to the address on every EVM chain, and null elsewhere and where the holder has no live attestation.</td>
    </tr>

    <tr>
      <td>`attested_at`</td>
      <td>`TIMESTAMP`</td>
      <td>Timestamp the attestation was issued. Null iff `attested_country` is null.</td>
    </tr>
  </tbody>
</table>

**Venues**

One row per project tagged as a venue a wallet can be funded from: an exchange, a custodian or a fiat ramp. `funding_jurisdiction` is set only where the venue passes the jurisdiction gate above.

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

  <tbody>
    <tr>
      <td>`venue_project_id`</td>
      <td>`STRING`</td>
      <td>The venue, as a `dimensions.projects` key.</td>
    </tr>

    <tr>
      <td>`name`</td>
      <td>`STRING`</td>
      <td>Venue's display name.</td>
    </tr>

    <tr>
      <td>`venue_type`</td>
      <td>`STRING`</td>
      <td>`cex` or `fiat-ramps`, read from the venue's registry tags.</td>
    </tr>

    <tr>
      <td>`legal_entity_name`</td>
      <td>`STRING`</td>
      <td>The venue's authored operating legal entity name.</td>
    </tr>

    <tr>
      <td>`legal_domicile`</td>
      <td>`STRING`</td>
      <td>ISO 3166-1 alpha-2 of the legal entity's domicile, as authored.</td>
    </tr>

    <tr>
      <td>`operating_scope`</td>
      <td>`STRING`</td>
      <td>The venue's authored operating footprint: `single_country`, `regional` or `global`. Null where the registry has not recorded it. `single_country` is one of the three facts the jurisdiction gate above requires.</td>
    </tr>

    <tr>
      <td>`onboarding_scope`</td>
      <td>`STRING`</td>
      <td>Who the venue admits as a customer, as authored: `residents_only`, `open` or `fiat_rail_only`. Null where the registry has not recorded it. `residents_only` is one of the three facts the gate requires.</td>
    </tr>

    <tr>
      <td>`service_jurisdictions`</td>
      <td>`ARRAY<STRING>`</td>
      <td>Countries the venue is authored as actively serving.</td>
    </tr>

    <tr>
      <td>`restricted_jurisdictions`</td>
      <td>`ARRAY<STRING>`</td>
      <td>Countries the venue is authored as restricting.</td>
    </tr>

    <tr>
      <td>`licence_count`</td>
      <td>`INT64`</td>
      <td>Count of the venue's licence rows.</td>
    </tr>

    <tr>
      <td>`licences_without_country`</td>
      <td>`INT64`</td>
      <td>Of those, licence rows recorded with no country. The gate fails while this count is above zero.</td>
    </tr>

    <tr>
      <td>`licence_countries`</td>
      <td>`ARRAY<STRING>`</td>
      <td>Countries those licences are held in. The gate requires exactly one; more than one, or zero, fails it.</td>
    </tr>

    <tr>
      <td>`licence_status`</td>
      <td>`STRING`</td>
      <td>Comma-joined distinct status values across the venue's licences.</td>
    </tr>

    <tr>
      <td>`funding_wallet_count`</td>
      <td>`INT64`</td>
      <td>Funding wallets attributed to this venue.</td>
    </tr>

    <tr>
      <td>`funding_wallets_without_country`</td>
      <td>`INT64`</td>
      <td>Of those, wallets whose registry row names no country. The gate fails while this count is above zero.</td>
    </tr>

    <tr>
      <td>`entities`</td>
      <td>`ARRAY<STRING>`</td>
      <td>Distinct legal entity names across the venue's funding wallets.</td>
    </tr>

    <tr>
      <td>`entity_countries`</td>
      <td>`ARRAY<STRING>`</td>
      <td>Distinct countries those entities resolve to. The gate requires exactly one, matching `licence_countries`' single country.</td>
    </tr>

    <tr>
      <td>`funding_jurisdiction`</td>
      <td>`STRING`</td>
      <td>ISO 3166-1 alpha-2, set only where `gate_reason` reads `qualifies`. Null on every other venue.</td>
    </tr>

    <tr>
      <td>`funding_jurisdiction_name`</td>
      <td>`STRING`</td>
      <td>Display name of `funding_jurisdiction`, on the same terms.</td>
    </tr>

    <tr>
      <td>`gate_reason`</td>
      <td>`STRING`</td>
      <td>The first of the gate's checks this venue fails, in the order named above, or `qualifies` when none does: `operating_scope_not_single_country`, `onboarding_not_residents_only`, `licence_country_missing_or_multiple`, `entity_country_missing_or_mismatched`, `jurisdiction_unknown`, or `qualifies`.</td>
    </tr>
  </tbody>
</table>

## Sample queries

**Look up an account**

The table is clustered on `chain_id` and `address`, so filtering on both is the cheapest lookup. Lowercase an EVM address copied from an explorer before you paste it in.

```sql theme={null}
select
    chain_id,
    address,
    project_id,
    contract_name,
    account_type,
    label_source
from `dimensions.accounts`
where chain_id = 'ethereum'
    and address = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'
```

**An account's attested country**

The attested country sits on the account row, so the same `chain_id` and `address` lookup returns it beside the region and the funding venue. It is filled on every EVM chain of an attested address.

```sql theme={null}
select
    chain_id,
    address,
    attested_country,
    attested_at,
    region,
    funding_venue_project_id
from `dimensions.accounts`
where chain_id = 'base'
    and address = '0x0000000000000000000000000000000000000001'
```

**What one project operates**

`label_source` splits how an address was attributed: `curated` is the set a person authored, and the rest is factory output. A null `label_source` is an address nobody has attributed.

```sql theme={null}
select
    chain_id,
    address,
    contract_name,
    account_type
from `dimensions.accounts`
where project_id = 'uniswap'
  and label_source = 'curated'
order by chain_id, contract_name
limit 100
```

**Addresses per project on one chain**

`project_id` joins `dimensions.projects` for the display name and the market sector, which is how a chain's labeled addresses group into sectors.

```sql theme={null}
select
    projects.name,
    projects.primary_market_sector,
    count(*) as addresses
from `dimensions.accounts` as accounts
join `dimensions.projects` as projects
    using (project_id)
where accounts.chain_id = 'ethereum'
  and accounts.label_source = 'curated'
group by projects.name, projects.primary_market_sector
order by addresses desc
limit 50
```

**Venues with a funding jurisdiction**

`gate_reason` reads `qualifies` only where the venue's operating scope, onboarding scope, and licence and entity countries all agree on one country.

```sql theme={null}
select
    venue_project_id,
    name,
    venue_type,
    funding_jurisdiction
from `dimensions.venues`
where gate_reason = 'qualifies'
order by name
```


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