Skip to main content

Available Endpoints

The Protocols API is organized into the categories below:

Core Protocols

DEX Protocols

Lending Protocols

DATs

Digital asset treasury (DAT) companies are public companies holding crypto on their balance sheet. They are not DeFi protocols, so a DAT is keyed by its stock ticker (MSTR) rather than a protocol slug, and its data comes at two grains: the company’s own capital structure, and its holdings broken out per asset.

ETFs

Crypto exchange-traded funds are covered at two grains, and they are independent cuts, not a parent and a child: one series per issuer (blackrock), and one series per underlying crypto asset (bitcoin). They ship as two sibling collections, so neither nests inside the other.

TCG

Trading-card and collectibles platforms are covered per platform and chain. A platform is keyed by its Blockworks Research slug (courtyard), and a series is keyed by the platform and the chain together (courtyard_polygon), because a platform running on more than one chain reports separately on each.

Interoperability Protocols

Liquid Staking Protocols

Lending and DEX metrics

Lending and DEX protocols carry the additional metrics below. Coverage varies by protocol: not every protocol reports every field, and one that does not returns null. Check for null rather than assuming a value is present.

Lending

Available on List Lending Protocols and on Get Lending Timeseries at 1d and 1w granularity.
depositsUsd is a balance and carries no 24Hour qualifier, so it aggregates as an average over a longer granularity. The existing netDeposits24HourUsd is a daily flow, and the two are not interchangeable. Likewise flashLoanFees24HourUsd is a fee, while the existing flashLoanVolume24HourUsd on DEX protocols is a volume.
revenueUsd is the Blockworks Research lending revenue. It is not revenue24HourUsd, which comes from a different source and is served by the core protocol and network endpoints. The two measure different things and report different values for the same protocol on the same day. Keep them apart.

Lending grains

Lending data is served at three grains. Each one is a separate dataset with its own metrics and its own route: The two finer grains return many series in one response, so their shape differs from both single-protocol routes and from Get All Lending Time Series, which keys each series on a protocol object instead of on dimensions. Here each entry carries its own id and its own dimensions, and metadata.pointSchemas names the columns of every points row:
marketName is present on the lending-markets dataset only. Both finer grains serve 1d only. The protocol grain still serves 1d and 1w.
Blockworks Research maps a fraction of lending protocols. A protocol it does not map returns 200 with an empty series list, not a 404. A 404 means the identifier is not a Messari protocol at all. Note also that a product slug is not a protocol identifier: pass aave, not aave-v3.

Finding instances and markets

List Lending Protocols carries an instances array on each protocol, so you can see which products and chains a protocol reports before you request a timeseries:
The array is empty for a protocol that Blockworks Research does not map. Instances need no listing of their own, because the per-protocol route returns all of them. Markets do: their ids are pool addresses, and there are thousands. Use List Lending Markets to discover them, filtered by protocol, product or chain. The protocol object on each row is the parent protocol, so its slug passes straight back as the protocol filter. The specific product is the sibling productSlug field, which the product filter matches:
marketId is a composite of parent slug, product slug, chain and market key. It is keyed on the pool address rather than the market name, so it survives an upstream rename. Some source rows carry no name; marketName is then the market key, and it can be an empty string.

Response caps

A single request returns at most 100 instance series or 250 market series. Above that the request returns 400 and names the filters that narrow it. Pass product and chain to the markets timeseries route to stay under the cap — a large protocol such as Euler or Morpho needs them.

DEX

Available on List DEX Protocols and on Get DEX Timeseries at 1d and 1w granularity.

DEX volume splits

Three more DEX fields are available on the listing endpoint only, not on the timeseries endpoints: volumeByCategory has the keys nativeStablecoin, chainToken, foreignToken, stablecoinSwaps, lstSwaps, composites, tokenizedAssets, projectTokens and memes. volumeByPair has the keys bitcoinUsd, ethereumUsd, solanaUsd, avalancheUsd, bnbUsd, bitcoinEthereum, bitcoinSolana, ethereumSolana, fx and eurUsd. Both objects are omitted entirely for a protocol that reports no split at all. Within an object that is present, a category or pair with no reported volume is null. An absent object and a null value therefore carry different meanings: the first means the protocol reports no split, the second means the protocol reports a split but not for that one category or pair.

Digital asset treasury companies

DAT data is served at two grains. Each is a separate dataset with its own metrics and its own route: Both serve 1d only. Every route exists in a one-entity and an all-entities form, so a full sweep of either grain is a single request rather than one call per company.

Identifiers

A DAT’s id is its stock ticker, not a protocol slug. The per-company routes accept either the ticker or the company’s Messari project slug.
Identifiers are case-sensitive. MSTR and micro-strategy both resolve; mstr returns 404. A ticker is upper-case and a slug is lower-case, so pass each one as the API stores it.
Not every company maps to a Messari project. Where none exists, slug is an empty string and projectId is absent — the company is still returned with full treasury data.

Holdings and assetSymbol

A holdings series is keyed on companyTicker_assetSymbol, and both halves are published beside the composite id so you never have to split it:
assetSymbol is a lower-cased ticker symbol (btc, eth, hype), not a Messari asset slug such as bitcoin. It is lower-cased so that companyTicker + _ + assetSymbol reconstructs the series id exactly. networkSlug is a genuine slug, but it is null for some assets, so it is not a substitute.
The listing’s assetSymbol filter narrows to companies holding a given asset, and matches either casing. Each row also carries a holdings summary naming every asset the company holds, so you can see the by-asset coverage before calling the holdings routes.

Latest values on the listing

The listing reports each company’s most recent treasury point from the last 30 days. A company that reported nothing in that window returns null values and a null asOfTime, rather than a stale figure presented as current. Always read asOfTime to see which you got.

Crypto ETFs

ETF data is served at two grains. Unlike the DAT grains above, neither is a child of the other — they are two independent cuts of the same Blockworks Research data, so they are two sibling collections with a dataset each: Both publish a single dataset slugged overview and serve 1d only. Because both use the same dataset slug, the combined metrics endpoint carries a grain on each entry (providers or assets) to tell them apart. Every route exists in a one-entity and an all-entities form, so a full sweep of either grain is a single request rather than one call per issuer or asset.
ETF issuers are asset managers, not DeFi protocols. Their placement under /protocols is pragmatic — it keeps them beside the other Blockworks Research collections — but an ETF provider is not a protocol and carries no protocol metrics.

Identifiers

An issuer’s id is its Blockworks Research provider slug (blackrock), and an underlying asset’s id is its asset symbol (bitcoin). Both per-entity routes also accept the Messari slug mapped onto the entity, so either resolves to the same series:
Not every entity maps to a Messari record. Where none exists, slug is an empty string and only the id resolves — the entity is still returned with full data.

Reading a point

A point is a timestamp followed by one value per metric, in the order metadata.pointSchemas declares. The metric slugs are the same kebab-case slugs the metrics catalog publishes, so a pointSchemas entry names the column beside it:
On the two all-entities endpoints pointSchemas sits once in metadata, not per entity: every series in the response reads the same dataset.

Latest values on the listings

Both listings report each entity’s most recent point from the last 30 days. An entity that reported nothing in that window returns null values and a null asOf, rather than a stale figure presented as current. Always read asOf to see which you got. Sorting on a metric orders on that latest value. A row with no value for the sort metric always sorts last, in either direction — a missing AUM is not an AUM of zero, so it never leads an ascending sort.
Every ETF metric is sourced from Blockworks Research.

Trading card platforms

Trading-card and collectibles (TCG) platforms sell and trade digital collectibles, often backed by graded physical cards. They are covered at a single grain — one series per platform and chain — and publish one dataset, slugged overview, at 1d only. A platform that runs on more than one chain reports separately on each, so it has one series per chain rather than one series overall.
Nothing is aggregated across a platform’s chains, and you should not aggregate it yourself. dauNew, dauRecurring, dauTotal and uniqueBuyers are distinct counts of users, and a user active on two chains is counted on both — so summing them across chains overstates the total. topSaleUsd is a maximum, not a sum, so adding it across chains is meaningless too.

Identifiers

Two identifiers appear, and they are not interchangeable: The series key is a composite of the two, but never split it yourself — either half may itself contain an underscore. Every series carries platform and chain as their own fields for exactly this reason:
That is also how the listing and the series join: a chains[].id from the listing matches the id of a series one-for-one. A platform slug the listing does not serve returns 404, rather than an empty series list.

The chains array

Every listing row carries a chains array, whether the platform runs on one chain or several. Read it rather than assuming a single chain — the array is the shape in both cases, so no consumer needs to special-case the multi-chain platforms. Paging is over platforms, not over platform-chain pairs, so a multi-chain platform is never split across two pages.

Messari mappings

projectSlug on a platform and networkSlug on a chain are the Messari mappings. Both are null where no Messari record maps to the entity. They are null, never an empty string, so a missing mapping is never mistaken for a real but blank slug.

Reading a point

A point is a timestamp followed by one value per metric, in the order metadata.pointSchemas declares. pointSchemas sits once in metadata, not per series: every series in the response reads the same dataset. Both time series routes return the same multi-series shape. The per-platform route is only a narrowing of the all-platforms one, so a consumer can read either with the same code.
Every TCG metric is sourced from Blockworks Research.

Key Features

  • Multi-Chain Aggregation: Protocol data aggregates all deployments across multiple blockchain networks (e.g., Uniswap includes V3, V2, and V1)
  • Comprehensive Metrics: Access volume, TVL, fees, and other key protocol metrics
  • Flexible Time Ranges: Query data with various granularities from 1-minute to 1-year intervals
  • Historical Data: Access historical protocol performance data for analysis and tracking

Use Cases

The Protocols API enables developers to:
  • Build DeFi analytics dashboards tracking protocol performance
  • Compare metrics across different protocols and protocol types
  • Monitor DEX trading volumes and liquidity trends
  • Track lending protocol utilization and interest rates
  • Create alerts based on protocol metric thresholds
  • Analyze protocol growth and adoption over time