curl --request POST \
--url https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"metric_ids": [
"asset_price",
"asset_holders"
],
"group_by": "assets",
"interval": "30d",
"data_ids": [
"ethereum"
],
"product_ids": [
"usdc"
],
"asset_ids": [
"<string>"
],
"chain_ids": [
"ethereum",
"base"
],
"market_sector_ids": [
"blockchains-l1",
"lending"
],
"reference_asset_ids": [
"creditfund"
],
"venues": [
{
"data_id": "aave",
"product_id": "aavev3"
}
],
"includeSelf": false,
"start": "2023-12-25",
"end": "2023-12-25",
"ignore_threshold": false
}
'import requests
url = "https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown"
payload = {
"metric_ids": ["asset_price", "asset_holders"],
"group_by": "assets",
"interval": "30d",
"data_ids": ["ethereum"],
"product_ids": ["usdc"],
"asset_ids": ["<string>"],
"chain_ids": ["ethereum", "base"],
"market_sector_ids": ["blockchains-l1", "lending"],
"reference_asset_ids": ["creditfund"],
"venues": [
{
"data_id": "aave",
"product_id": "aavev3"
}
],
"includeSelf": False,
"start": "2023-12-25",
"end": "2023-12-25",
"ignore_threshold": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
metric_ids: ['asset_price', 'asset_holders'],
group_by: 'assets',
interval: '30d',
data_ids: ['ethereum'],
product_ids: ['usdc'],
asset_ids: ['<string>'],
chain_ids: ['ethereum', 'base'],
market_sector_ids: ['blockchains-l1', 'lending'],
reference_asset_ids: ['creditfund'],
venues: [{data_id: 'aave', product_id: 'aavev3'}],
includeSelf: false,
start: '2023-12-25',
end: '2023-12-25',
ignore_threshold: false
})
};
fetch('https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'metric_ids' => [
'asset_price',
'asset_holders'
],
'group_by' => 'assets',
'interval' => '30d',
'data_ids' => [
'ethereum'
],
'product_ids' => [
'usdc'
],
'asset_ids' => [
'<string>'
],
'chain_ids' => [
'ethereum',
'base'
],
'market_sector_ids' => [
'blockchains-l1',
'lending'
],
'reference_asset_ids' => [
'creditfund'
],
'venues' => [
[
'data_id' => 'aave',
'product_id' => 'aavev3'
]
],
'includeSelf' => false,
'start' => '2023-12-25',
'end' => '2023-12-25',
'ignore_threshold' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown"
payload := strings.NewReader("{\n \"metric_ids\": [\n \"asset_price\",\n \"asset_holders\"\n ],\n \"group_by\": \"assets\",\n \"interval\": \"30d\",\n \"data_ids\": [\n \"ethereum\"\n ],\n \"product_ids\": [\n \"usdc\"\n ],\n \"asset_ids\": [\n \"<string>\"\n ],\n \"chain_ids\": [\n \"ethereum\",\n \"base\"\n ],\n \"market_sector_ids\": [\n \"blockchains-l1\",\n \"lending\"\n ],\n \"reference_asset_ids\": [\n \"creditfund\"\n ],\n \"venues\": [\n {\n \"data_id\": \"aave\",\n \"product_id\": \"aavev3\"\n }\n ],\n \"includeSelf\": false,\n \"start\": \"2023-12-25\",\n \"end\": \"2023-12-25\",\n \"ignore_threshold\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"metric_ids\": [\n \"asset_price\",\n \"asset_holders\"\n ],\n \"group_by\": \"assets\",\n \"interval\": \"30d\",\n \"data_ids\": [\n \"ethereum\"\n ],\n \"product_ids\": [\n \"usdc\"\n ],\n \"asset_ids\": [\n \"<string>\"\n ],\n \"chain_ids\": [\n \"ethereum\",\n \"base\"\n ],\n \"market_sector_ids\": [\n \"blockchains-l1\",\n \"lending\"\n ],\n \"reference_asset_ids\": [\n \"creditfund\"\n ],\n \"venues\": [\n {\n \"data_id\": \"aave\",\n \"product_id\": \"aavev3\"\n }\n ],\n \"includeSelf\": false,\n \"start\": \"2023-12-25\",\n \"end\": \"2023-12-25\",\n \"ignore_threshold\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"metric_ids\": [\n \"asset_price\",\n \"asset_holders\"\n ],\n \"group_by\": \"assets\",\n \"interval\": \"30d\",\n \"data_ids\": [\n \"ethereum\"\n ],\n \"product_ids\": [\n \"usdc\"\n ],\n \"asset_ids\": [\n \"<string>\"\n ],\n \"chain_ids\": [\n \"ethereum\",\n \"base\"\n ],\n \"market_sector_ids\": [\n \"blockchains-l1\",\n \"lending\"\n ],\n \"reference_asset_ids\": [\n \"creditfund\"\n ],\n \"venues\": [\n {\n \"data_id\": \"aave\",\n \"product_id\": \"aavev3\"\n }\n ],\n \"includeSelf\": false,\n \"start\": \"2023-12-25\",\n \"end\": \"2023-12-25\",\n \"ignore_threshold\": false\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"asset_id": "<string>",
"data_id": "<string>",
"product_id": "<string>",
"chain_id": "<string>",
"market_sector_id": "<string>",
"reference_asset_id": "<string>",
"reference_asset": "<string>",
"venue_data_id": "<string>",
"venue_product_id": "<string>",
"metrics": {}
}
],
"errors": [
{
"code": "NOT_FOUND",
"field": "project_ids",
"value": "invalid-project"
}
]
}{
"code": "<string>",
"message": "<string>",
"meta": {}
}Get asset metrics breakdown
Use this endpoint to retrieve aggregated breakdown data for asset metrics across different dimensions (projects, chains, market sectors, etc.).
If an empty metric_ids array is provided, it defaults to ['asset_price'].
curl --request POST \
--url https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"metric_ids": [
"asset_price",
"asset_holders"
],
"group_by": "assets",
"interval": "30d",
"data_ids": [
"ethereum"
],
"product_ids": [
"usdc"
],
"asset_ids": [
"<string>"
],
"chain_ids": [
"ethereum",
"base"
],
"market_sector_ids": [
"blockchains-l1",
"lending"
],
"reference_asset_ids": [
"creditfund"
],
"venues": [
{
"data_id": "aave",
"product_id": "aavev3"
}
],
"includeSelf": false,
"start": "2023-12-25",
"end": "2023-12-25",
"ignore_threshold": false
}
'import requests
url = "https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown"
payload = {
"metric_ids": ["asset_price", "asset_holders"],
"group_by": "assets",
"interval": "30d",
"data_ids": ["ethereum"],
"product_ids": ["usdc"],
"asset_ids": ["<string>"],
"chain_ids": ["ethereum", "base"],
"market_sector_ids": ["blockchains-l1", "lending"],
"reference_asset_ids": ["creditfund"],
"venues": [
{
"data_id": "aave",
"product_id": "aavev3"
}
],
"includeSelf": False,
"start": "2023-12-25",
"end": "2023-12-25",
"ignore_threshold": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
metric_ids: ['asset_price', 'asset_holders'],
group_by: 'assets',
interval: '30d',
data_ids: ['ethereum'],
product_ids: ['usdc'],
asset_ids: ['<string>'],
chain_ids: ['ethereum', 'base'],
market_sector_ids: ['blockchains-l1', 'lending'],
reference_asset_ids: ['creditfund'],
venues: [{data_id: 'aave', product_id: 'aavev3'}],
includeSelf: false,
start: '2023-12-25',
end: '2023-12-25',
ignore_threshold: false
})
};
fetch('https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'metric_ids' => [
'asset_price',
'asset_holders'
],
'group_by' => 'assets',
'interval' => '30d',
'data_ids' => [
'ethereum'
],
'product_ids' => [
'usdc'
],
'asset_ids' => [
'<string>'
],
'chain_ids' => [
'ethereum',
'base'
],
'market_sector_ids' => [
'blockchains-l1',
'lending'
],
'reference_asset_ids' => [
'creditfund'
],
'venues' => [
[
'data_id' => 'aave',
'product_id' => 'aavev3'
]
],
'includeSelf' => false,
'start' => '2023-12-25',
'end' => '2023-12-25',
'ignore_threshold' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown"
payload := strings.NewReader("{\n \"metric_ids\": [\n \"asset_price\",\n \"asset_holders\"\n ],\n \"group_by\": \"assets\",\n \"interval\": \"30d\",\n \"data_ids\": [\n \"ethereum\"\n ],\n \"product_ids\": [\n \"usdc\"\n ],\n \"asset_ids\": [\n \"<string>\"\n ],\n \"chain_ids\": [\n \"ethereum\",\n \"base\"\n ],\n \"market_sector_ids\": [\n \"blockchains-l1\",\n \"lending\"\n ],\n \"reference_asset_ids\": [\n \"creditfund\"\n ],\n \"venues\": [\n {\n \"data_id\": \"aave\",\n \"product_id\": \"aavev3\"\n }\n ],\n \"includeSelf\": false,\n \"start\": \"2023-12-25\",\n \"end\": \"2023-12-25\",\n \"ignore_threshold\": false\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"metric_ids\": [\n \"asset_price\",\n \"asset_holders\"\n ],\n \"group_by\": \"assets\",\n \"interval\": \"30d\",\n \"data_ids\": [\n \"ethereum\"\n ],\n \"product_ids\": [\n \"usdc\"\n ],\n \"asset_ids\": [\n \"<string>\"\n ],\n \"chain_ids\": [\n \"ethereum\",\n \"base\"\n ],\n \"market_sector_ids\": [\n \"blockchains-l1\",\n \"lending\"\n ],\n \"reference_asset_ids\": [\n \"creditfund\"\n ],\n \"venues\": [\n {\n \"data_id\": \"aave\",\n \"product_id\": \"aavev3\"\n }\n ],\n \"includeSelf\": false,\n \"start\": \"2023-12-25\",\n \"end\": \"2023-12-25\",\n \"ignore_threshold\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.tokenterminal.com/v2/assets/{asset_id}/metrics-breakdown")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"metric_ids\": [\n \"asset_price\",\n \"asset_holders\"\n ],\n \"group_by\": \"assets\",\n \"interval\": \"30d\",\n \"data_ids\": [\n \"ethereum\"\n ],\n \"product_ids\": [\n \"usdc\"\n ],\n \"asset_ids\": [\n \"<string>\"\n ],\n \"chain_ids\": [\n \"ethereum\",\n \"base\"\n ],\n \"market_sector_ids\": [\n \"blockchains-l1\",\n \"lending\"\n ],\n \"reference_asset_ids\": [\n \"creditfund\"\n ],\n \"venues\": [\n {\n \"data_id\": \"aave\",\n \"product_id\": \"aavev3\"\n }\n ],\n \"includeSelf\": false,\n \"start\": \"2023-12-25\",\n \"end\": \"2023-12-25\",\n \"ignore_threshold\": false\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"asset_id": "<string>",
"data_id": "<string>",
"product_id": "<string>",
"chain_id": "<string>",
"market_sector_id": "<string>",
"reference_asset_id": "<string>",
"reference_asset": "<string>",
"venue_data_id": "<string>",
"venue_product_id": "<string>",
"metrics": {}
}
],
"errors": [
{
"code": "NOT_FOUND",
"field": "project_ids",
"value": "invalid-project"
}
]
}{
"code": "<string>",
"message": "<string>",
"meta": {}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
ID of the asset
Allows you to select one of the assets available.
The full list is available on the assets endpoint (see above).
Body
List of metrics to include according to asset metric availability.
Allows you to select one or more of the metrics available for a specific asset.
If an empty array is provided, it defaults to ['asset_price'].
["asset_price", "asset_holders"]
Dimension to group the breakdown by.
Available options: assets, projects, product, chains, market-sector, reference-asset, chain-asset, chain-project, product+chain, venue, asset+venue, venue+chain, market-sector+venue.
reference-asset groups by the price reference the underlying assets track (for example Credit fund, S&P 500), and returns a reference_asset label on each row. Assets that track no reference asset are excluded from that breakdown.
The venue composites (asset+venue, venue+chain, market-sector+venue) combine venue with a second dimension and are only meaningful for the venue-scoped metrics (asset_tvl, asset_trading_volume, asset_notional_trading_volume).
assets, projects, product, chains, market-sector, reference-asset, chain-asset, chain-project, product+chain, venue, asset+venue, venue+chain, market-sector+venue "assets"
Length of the aggregation window. Defaults to 7d. The window ends at the latest available date, or the day before end if given.
Ignored when both start and end are given; the window is then the date range [start, end).
24h, 7d, 30d, 90d, 180d, 365d, 1095d, 1825d, ytd, max "30d"
List of project data IDs to filter by.
Allows you to select one or more projects. When including multiple projects, separate each one with a comma.
["ethereum"]
List of product IDs to filter by.
Allows you to select one or more products. When including multiple products, separate each one with a comma.
["usdc"]
List of asset IDs to filter by.
Allows you to select one or more assets. When including multiple assets, separate each one with a comma.
List of chain IDs to filter by.
Allows you to select one or more chains. When including multiple chains, separate each one with a comma.
["ethereum", "base"]
List of market sector IDs to filter by.
Allows you to select one or more market sectors. When including multiple market sectors, separate each one with a comma.
The full list of available market sectors can be retrieved from the /v2/market-sectors endpoint.
["blockchains-l1", "lending"]
List of reference asset IDs to filter by (for example creditfund, sp500).
The filter counterpart of group_by: reference-asset: use it to restrict the breakdown to assets tracking a specific price reference. Assets that track no reference asset are excluded.
The full list of available reference assets can be retrieved from the /v2/reference-assets endpoint.
["creditfund"]
List of venues (the protocol and product a metric was earned on) to filter by. Only applies to venue-scoped metrics (asset_tvl, asset_trading_volume, asset_notional_trading_volume) -- distinct from data_ids/product_ids, which filter by the asset's own issuer or manager.
Each entry must specify both data_id and product_id together -- a product_id can never be given without its matching data_id.
Show child attributes
Show child attributes
[
{ "data_id": "aave", "product_id": "aavev3" }
]
Include the asset itself in the breakdown results.
If not specified, defaults to false.
First date of the aggregation window, inclusive (YYYY-MM-DD).
With end, the window is the half-open range [start, end) and interval is ignored. Without end, the window spans interval days starting on start.
End of the aggregation window, exclusive (YYYY-MM-DD). Data for this date is not included; must be after start, otherwise the request is rejected with a 400.
For a full calendar month use the first day of the next month, e.g. start=2026-08-01, end=2026-09-01. Without start, the window spans interval days ending the day before end. If omitted entirely, the window ends at the latest date for which data is available. If the day before end has no data yet, the window ends at the latest available date before it.
Ignore metric thresholds when calculating breakdowns.
If not specified, defaults to false.