For the complete documentation index, see llms.txt. This page is also available as Markdown.

Asset Profiles

Overview

An asset profile is a structured, human-curated description of a cryptoasset. It answers the questions that a price series or a market record does not: why the asset exists, who builds it, how its supply was created and how it is distributed, which networks it lives on, what has happened to it since launch, and whether it is regulated or wrapped in a regulated product. Every field is written and reviewed by analysts from primary sources rather than derived from market activity, so a profile reads as an editorial reference rather than a computed dataset.

Research teams use profiles to understand an unfamiliar asset without leaving the API, and to attach durable descriptive context to quantitative work. Product and compliance teams use the supply, issuance, and regulation fields to answer diligence questions consistently across a universe of assets.

At a Glance

Data type
Entities
Frequency / cadence
Unit
Primary endpoint
Coverage

Asset descriptions (reference data)

Assets

Reference data, published in releases as profiles are added or revised

Descriptive text, categorical labels, and dates

/profile/assets

🔗

Schema

The response returns one object per asset. Only the five required fields appear on every profile. Every other field appears only when it has been researched and found applicable for that asset, which means the set of keys differs from one profile to the next. See Curation depth for why, and How absent values are represented for how to read a field that is present but carries no information.

Fields are grouped below by what they describe. Every field returned by the endpoint appears exactly once across these tables.

Identity and description

Field
Type
Description
Notes

asset

string

Coin Metrics name of the asset, lowercased. Joins directly to the rest of the API.

Required

full_name

string

Full name of the asset.

Required

description

string

One or two sentences describing the asset's key features.

Required

overview

string

Longer description of the asset's key features and of the problem it was created to solve.

Required

creation_date

string (date)

Date of the asset's genesis block or first included block.

Required. Served as YYYY-MM-DD

website

string

Official project website. Absent when no official website was found.

Optional. All profiles

whitepaper_url

string

Official whitepaper. Absent when no official whitepaper was found.

Optional. All profiles

blog_updates

string

Blog on which the project posts updates.

Optional. Extended

project_github_repository

array[string]

Repositories relevant to the project.

Optional. Extended

Project and purpose

Field
Type
Description
Notes

token_purpose

array[string]

The main purposes the asset serves, for example a fee token on a network, a stablecoin, or a governance token. Observed values are Governance Token, Staking Token, Deposit Receipt, Fee Token, Stablecoin, Native Collateral Token, and Store of Value Token.

Optional. Extended

project_team

string

Name of the project team supporting the asset.

Optional. Extended

foundation

string

Name of the foundation supporting the asset.

Optional. Extended

Supply, issuance, and distribution

Field
Type
Description
Notes

token_generation_event_supply

string

Total supply of the token minted at genesis.

Optional. Extended

supply_cap

string

Maximum number of units programmed to exist over the lifetime of the asset. Uncapped supply is expressed two different ways, so test for a numeric value rather than for the key's presence. See Reading the supply cap.

Optional. All profiles

initial_supply_token_distribution

array[object]

Initial allocation of tokens, as a list of receiving entities and the share each received. Sub-fields: initial_supply_allocation (string, the receiving entity), initial_supply_distribution (string, the amount or percentage received).

Optional. Extended

vesting_schedule

array[object]

Vesting schedules disclosed by the project. Sub-fields: vesting_schedule_allocation (string, the entity subject to the schedule), vesting_schedule_cliff (string, the cliff in years), vesting_schedule_total_unlock_time (string, the total unlock period in years).

Optional. Extended

new_token_issuance_recipient

array[string]

Who receives newly issued tokens. Where tokens go to a class of participant rather than a named entity, the class is listed, for example Miner, Validator, Staker, or Minter.

Optional. Extended

issuance_schedule_changes

string

Changes that have occurred to the asset's issuance schedule, including the halving cadence where one applies.

Optional. Extended

Networks

Field
Type
Description
Notes

issuing_networks

array[string]

Networks on which the asset is natively issued, meaning not bridged or wrapped.

Optional. Extended

bridged_networks

array[string]

Networks the asset has been bridged to, including bridging by wrapping. Bitcoin, for example, is bridged to Ethereum by wrapping as WBTC.

Optional. Extended

Both fields carry network display names rather than the network identifiers used by Network Profiles. See Network names are not network identifiers.

History

Field
Type
Description
Notes

significant_historical_changes

array[object]

Notable events in the history of the asset or project. Sub-fields: date (string), details (string).

Optional. Extended

upgrade_history

array[object]

Upgrades made to the asset or project. Sub-fields: date (string), details (string).

Optional. Extended

The date sub-field on both is recorded at the most granular format that can be accurately asserted, so its precision varies by entry. See Event dates are free text.

Regulation

Field
Type
Description
Notes

asset_regulation

string

How the asset is regulated, as Directly or Indirectly. Direct regulation means explicit regulatory guidance applies to the asset itself, for example under MiCA in the European Union. Indirect regulation means the asset is reached through a regulated product such as a spot exchange-traded fund.

Optional. Extended

asset_regulated_products

array[string]

Regulated products released for the asset, such as exchange-traded products and exchange-traded funds.

Optional. Extended

etp_custodians

array[string]

Known custodians of the underlying asset for exchange-traded products.

Optional. Extended

Conventions. All values are returned as JSON strings, including numeric ones such as supply_cap, so that large supply figures keep full precision. Asset names are lowercased Coin Metrics asset names, so dai rather than DAI. creation_date is served as a plain calendar date with no time of day and no zone offset. There are no per-observation timestamps on this endpoint, because a profile describes an asset as it stands rather than at a point in time. A field that cannot be commented on, or that has not yet been researched for an asset, is omitted from the object rather than returned as null. A field that has been researched and found not applicable is returned as the string N/A (see How absent values are represented).

Methodology

Asset profiles are written rather than computed. Analysts research each asset from primary sources, record the result in a structured dataset, and publish it through the API.

Sourcing and curation

Every field traces to a primary source. Project websites, whitepapers, official documentation, governance forums, public repositories, and regulatory filings are the usual ones. Where a project's own material is ambiguous or silent, the field is left uncurated rather than inferred, which is why the depth of a profile reflects how much a project has actually disclosed.

Curated content is held in a version-controlled dataset and validated against a published schema before it can be released. The schema fixes the field names, types, and nesting, so a release cannot introduce a malformed profile or silently rename a field. Editorial review sits ahead of that validation, so a change is reviewed before it is merged.

Release cadence

Profiles are published in discrete releases rather than updated continuously. The API serves a pinned version of the profile dataset, and a release replaces that pinned version wholesale. Between releases the response is stable. There is no fixed schedule and the interval between releases is not fixed.

Because releases are discrete, a newly launched asset does not appear the moment it starts trading, and a change in a project's circumstances is reflected at the next release rather than immediately.

Curation depth

Profiles come at two depths, and the difference is substantial enough to plan around.

Every profile carries the core fields: asset, full_name, description, overview, creation_date, and, where they exist, website, whitepaper_url, and supply_cap. This is the descriptive baseline, and it is available for the whole covered universe.

A smaller set of assets also carries the extended fields, meaning everything else in the schema: purpose and team, supply and vesting detail, issuing and bridged networks, event history, and regulatory status. These are the assets that have been through the deeper curation process, which is ongoing and expands with each release.

How absent values are represented

A field can be missing information in two distinct ways, and they mean different things.

An omitted key means the field either cannot be commented on for that asset or has not yet been researched. Nothing has been asserted about it either way. Most omissions are simply an asset that has not yet had the extended fields written. supply_cap is the one exception, where an omitted key is itself the answer (see Reading the supply cap).

The string N/A means the field has been researched and analysts have concluded it is not applicable to that asset: it has no supply cap, no vesting schedule, no foundation, or no regulated products. This is a positive statement of absence rather than a gap.

Neither state is permanent. Both are revisited as research continues, so a field that is absent or N/A today can carry a value in a later release.

N/A appears wherever a string is expected, including inside arrays and inside the objects nested in vesting_schedule, initial_supply_token_distribution, significant_historical_changes, and upgrade_history. An array whose only element is an N/A object is the empty case for that field, not a real entry, so code that counts vesting tranches or historical events should filter it out before counting. The Dai example shows this shape.

Because N/A is a string, it also appears in fields that otherwise hold numbers. supply_cap is "N/A" for many assets with no cap, so parse it defensively rather than casting straight to a number.

Reading the supply cap

supply_cap is the one field where an omitted key carries meaning, so the general rule above does not apply to it. The field has three states, and two of them mean the same thing:

  • A numeric string, such as "21000000". The asset has a programmed maximum supply.

  • The string "N/A". The asset is uncapped. This is the researched answer, meaning analysts looked and concluded there is no cap.

  • The key absent. Also uncapped. Assets with no programmed maximum are the reason the field is optional in the first place.

Both "N/A" and absence are used for uncapped assets, which is why a presence check is the wrong test. usdc and dai report "N/A", while eos, near, and xtz omit the key, and all of them are uncapped. Read the field by testing whether the value parses as a number, and treat everything else as uncapped:

One caveat. On a core profile, where most fields are uncurated anyway, an absent supply_cap is weaker evidence than it is on an extended profile, because you cannot tell a researched "uncapped" from a field that has not been researched yet. If the distinction matters for your use case, restrict the test to extended profiles.

Event dates are free text

The date sub-field inside significant_historical_changes and upgrade_history is recorded at the most granular format that can be accurately asserted, up to a full calendar date. Where the exact date can no longer be ascertained, it falls back to the month, or to the year, depending on which granularity holds up. Values therefore range from a full date such as 2024-08-27, to a month such as 2012-04, to a year such as 2014, to N/A where the timing is unknown.

Because the granularity varies from one entry to the next, parse the field as text and treat any date arithmetic on it as best effort. A coarser value is a statement about how precisely the event can be dated, not a placeholder for a date that exists somewhere else. The same applies to the date sub-field on network profiles.

Network names are not network identifiers

issuing_networks and bridged_networks carry human-readable network names such as Ethereum, OP Mainnet, and Avalanche C-Chain. These are display names written for a reader, not keys. They do not match the network identifiers used by Network Profiles, where the same networks are eth, op, and avaxc, and the profile universe covers many networks that have no network profile of their own. Join on these fields by name matching with care, and do not assume a name resolves to a network profile.

Accessing the Data

Asset profiles are served on a single endpoint, filtered by asset name or by full name.

Responses are paginated. The Python client follows pagination automatically, while direct HTTP callers page through results using next_page_token. The default page size is 100, so an unfiltered request that does not raise page_size or follow next_page_url returns only the first page. This endpoint does not support the format parameter, so json is the only representation and there is no CSV or streaming variant. Full parameter reference: see the API Reference for /profile/assets.

Examples

The two examples below are live responses showing each level of curation depth. Both are complete, with nothing truncated.

Example: an extended asset profile

A fully curated profile, carrying the whole schema. Note the N/A entries: Dai has no foundation, no supply cap, and no regulated products, and the single-element initial_supply_token_distribution and vesting_schedule arrays are the empty case rather than real allocations. Run this query.

Example: a core asset profile

The same endpoint for an asset that has not yet been through extended curation. The response is complete: the extended keys are omitted rather than returned empty, so an integration that assumes a fixed set of keys will break on profiles of this shape. Run this query.

Coverage

Asset profiles are not published on coverage.coinmetrics.io, and unlike the metric datasets they have no catalog endpoint either. Availability is read from the profile endpoint itself instead, which returns every asset that has a profile. This is the authoritative list of what is covered, and it stays current across releases.

  • /profile/assets: queried with no filters, returns every covered asset. There is no separate complete-versus-entitled view, because the endpoint returns what the requesting key is entitled to see.

The profile universe is a subset of the assets Coin Metrics covers elsewhere, so an asset with market or network data does not necessarily have a profile. It also runs the other way, because an asset name that appears in a profile is a standard Coin Metrics asset name and joins to the rest of the API. To check both sides, compare this list against /reference-data/assets.

Access to profiles is entitled separately from other datasets, so a key without the entitlement receives an authorization error rather than an empty result.

Usage

  • Enrich a quantitative universe with context. The asset field is a standard Coin Metrics asset name, so profiles join directly to /timeseries/asset-metrics, /reference-data/markets, and asset taxonomy classifications. Pulling the whole universe once and caching it is the normal pattern, because the data changes only at a release.

  • Screen by purpose or regulatory status. token_purpose, asset_regulation, and asset_regulated_products support questions such as which covered assets are stablecoins, or which have a spot exchange-traded fund and who custodies the underlying.

  • Map an asset's footprint across chains. issuing_networks and bridged_networks separate native issuance from wrapped or bridged representations, which matters when attributing supply or activity to a chain.

  • Answer supply and unlock questions. token_generation_event_supply, supply_cap, initial_supply_token_distribution, and vesting_schedule together describe how a token's supply was created and when it becomes liquid, for the assets where the project has disclosed it.

  • Build an event timeline. significant_historical_changes and upgrade_history give dated context for explaining a break in a price or network series, such as a fork, a halving, or a protocol upgrade.

  • Cache and diff between releases. Because the served dataset is pinned between releases, diffing a stored copy against a fresh pull is a reliable way to see exactly what a release changed.

Limitations

  • The endpoint is marked experimental. It is published as experimental in the API Reference, which means the schema can change with less notice than a stable endpoint. Code defensively against added or renamed fields.

  • Coverage is a subset of the asset universe. Many assets with market and network data have no profile at all, and the profile universe is not a coverage statement about anything else.

  • Most profiles carry core fields only. The extended fields exist for a minority of covered assets, so any screen built on token_purpose, asset_regulation, or the supply fields runs over that subset rather than the whole universe (see Curation depth).

  • The key set varies between profiles. Fields that cannot be commented on or have not been researched are omitted rather than returned as null, so an integration that assumes a fixed schema per row will break. Treat every field except the five required ones as optional.

  • N/A is a value, not an absence. It appears in string fields, in arrays, and inside nested objects, including fields that otherwise hold numbers (see How absent values are represented).

  • supply_cap expresses uncapped supply two ways. Some uncapped assets report "N/A" and others omit the key, so a presence check misclassifies one group or the other (see Reading the supply cap).

  • Content is editorial and updates on a release cadence. A profile reflects the state of research at the last release rather than the present moment, so recent events, listings, and regulatory developments can be absent. Nothing here is a real-time feed.

  • Not investment advice or a regulatory determination. asset_regulation records a researched observation about how an asset is treated, not a legal opinion, and it is not a statement about any particular jurisdiction.

  • Event dates are free text. date inside significant_historical_changes and upgrade_history is not a fixed format and cannot be parsed reliably (see Event dates are free text).

  • .to_dataframe() fails on this endpoint. The Python client cannot parse creation_date, so the dataframe helper raises. Use .to_list().

  • Network names do not join to network profiles. The network fields carry display names rather than network identifiers (see Network names are not network identifiers).

FAQ

Why does one profile have far more fields than another?

Because profiles come at two levels of curation depth. Every asset gets the core descriptive fields, while the extended fields are written for a smaller set of assets and added to with each release. The depth is not flagged in the response, so detect it from the presence of a key such as project_team. See Curation depth.

What is the difference between an omitted field and "N/A"?

An omitted field is one that either cannot be commented on or has not yet been researched, so nothing has been asserted about it. "N/A" means the field has been researched and analysts concluded it is not applicable to that asset, for example an asset with no supply cap or no vesting schedule. Neither is permanent, and both can be amended in a later release. See How absent values are represented.

How often do profiles change?

Only at a release, and releases have no fixed schedule. Between releases the response is stable, so polling gains nothing. The change log on the Profiles Overview records what each release added or revised.

Why did an asset I requested not come back?

Either it has no profile, or the identifier does not match. Unknown identifiers are dropped silently rather than raising an error, so a request for several assets can return fewer objects than you asked for. Check the returned asset values against your request, and query with no filters to see the covered list.

Can I search profiles by keyword, or filter by a field such as token_purpose?

No. The endpoint filters only on exact assets or full_names identifiers, with no wildcards and no partial matching. To screen on any other field, pull the universe and filter client-side.

Is supply_cap always a number?

No. It is a JSON string, and uncapped assets are represented two different ways: some report the string "N/A" and others omit the key entirely. Test whether the value parses as a number rather than testing for the key's presence, and never cast it directly. See Reading the supply cap.

Do issuing_networks values match the identifiers in Network Profiles?

No. They are display names such as Avalanche C-Chain, while network profiles use identifiers such as avaxc. There is also no requirement that a named network has a profile of its own. See Network names are not network identifiers.

Can I parse the dates in upgrade_history and significant_historical_changes?

Not reliably. Those date sub-fields are free text carrying whatever precision the event is known to, so a full date, a month, a year, and N/A all occur. See Event dates are free text.

  • Profiles Overview: how asset and network profiles fit together, plus the release change log.

  • Network Profiles: the same descriptive treatment for the networks assets are issued on and bridged to.

  • Asset Taxonomy: the datonomy classification of the same assets, as codes and names rather than prose.

Last updated