curl -X GET "https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio?asset=eth&exchange=binance&window=day" \
-H "Authorization: Bearer <YOUR_API_KEY>"fetch("https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio?asset=eth&exchange=binance&window=day", { headers: { "Authorization": "Bearer <YOUR_API_KEY>"} })
.then(response => response.json())
.then(data => console.log(data))require('axios')
.get("https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio?asset=eth&exchange=binance&window=day", { headers: { Authorization: 'Bearer <YOUR_API_KEY>' } })
.then(response => console.log(response))require 'net/http'
uri = URI("https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio?asset=eth&exchange=binance&window=day")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer <YOUR_API_KEY>"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.bodyimport requests
headers = {'Authorization': 'Bearer <YOUR_API_KEY>'}
url = "https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio?asset=eth&exchange=binance&window=day"
print(requests.get(url, headers=headers).json())<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio")
.header("Authorization", "Bearer <token>")
.asString();{
"status": {
"code": 123,
"message": "<string>"
},
"result": {
"window": "<string>",
"data": [
{
"datetime": "<string>",
"blockheight": 123,
"exchange_supply_ratio": 123,
"reserve": 123,
"supply_total": 123,
"supply_ratio": 123
}
]
}
}Exchange Supply Ratio
Exchange reserve divided by total supply — how much of the asset sits on a given exchange relative to everything in existence.
curl -X GET "https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio?asset=eth&exchange=binance&window=day" \
-H "Authorization: Bearer <YOUR_API_KEY>"fetch("https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio?asset=eth&exchange=binance&window=day", { headers: { "Authorization": "Bearer <YOUR_API_KEY>"} })
.then(response => response.json())
.then(data => console.log(data))require('axios')
.get("https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio?asset=eth&exchange=binance&window=day", { headers: { Authorization: 'Bearer <YOUR_API_KEY>' } })
.then(response => console.log(response))require 'net/http'
uri = URI("https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio?asset=eth&exchange=binance&window=day")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer <YOUR_API_KEY>"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.bodyimport requests
headers = {'Authorization': 'Bearer <YOUR_API_KEY>'}
url = "https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio?asset=eth&exchange=binance&window=day"
print(requests.get(url, headers=headers).json())<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.cryptoquant.com/v2/indicator/selling-activity/exchange-supply-ratio")
.header("Authorization", "Bearer <token>")
.asString();{
"status": {
"code": 123,
"message": "<string>"
},
"result": {
"window": "<string>",
"data": [
{
"datetime": "<string>",
"blockheight": 123,
"exchange_supply_ratio": 123,
"reserve": 123,
"supply_total": 123,
"supply_ratio": 123
}
]
}
}What it measures
Exchange reserve divided by total supply — how much of the asset sits on a given exchange relative to everything in existence. The response carries both inputs alongside the ratio. 📖 Data Guide: Exchange Supply Ratio — definition, interpretation, and chart examples.Assets and windows
This endpoint serves 4 asset classes. The available windows differ by class — a window that works for one asset can return400 for another.
| Asset class | What it covers | Assets | Windows |
|---|---|---|---|
| Bitcoin | the native asset of Bitcoin, asset=btc | btc | block |
| Native ETH | the native asset, asset=eth | eth | day |
| ERC-20 | ERC-20 tokens | 197 assets | day |
| Stablecoin | stablecoins issued on Ethereum | 76 assets | day |
day. A request for a window that the asset’s class does not support returns 400 and lists the windows that asset does support.
day is not served for btc, so a request that omits window returns 400 for btc assets. Pass window=block explicitly.Response fields
The time key depends on the window:datetime for day and blockheight plus datetime for block.
| Field | Type | Asset classes | Description |
|---|---|---|---|
exchange_supply_ratio | number | btc | Exchange reserve divided by total supply. |
reserve | number | eth, erc20, stablecoin | The on-chain balance held by the exchange at the end of the interval. |
supply_total | number | eth, erc20, stablecoin | The total amount of the asset in existence. |
supply_ratio | number | eth, erc20, stablecoin | Exchange reserve divided by total supply. |
Authorizations
For each API request, include the Authorization HTTP header with Bearer {access_token}.
Query Parameters
Asset to query, by its CryptoQuant alias (no chain suffix — usdt, not usdt_eth). 275 assets are available on this endpoint, across the asset classes btc, erc20, eth, stablecoin. Enumerate them with /v2/discovery/endpoints.
Chain the asset lives on. Optional for an asset that exists on exactly one chain, required when the same alias exists on several.
bitcoin, ethereum Exchange name, e.g. binance. Use all_exchange for the aggregate across every tracked exchange. Enumerate the accepted values with /v2/discovery/endpoints.
Aggregation window. Which windows are valid depends on the asset — see the endpoint page. Defaults to day. No default for Bitcoin (btc) assets — pass window explicitly (block), or the request returns 400.
day Inclusive start time, YYYYMMDDTHHMMSS (UTC). If window=day, YYYYMMDD is also accepted.
Inclusive end time, YYYYMMDDTHHMMSS (UTC). If window=day, YYYYMMDD is also accepted.
Maximum rows returned (default 100, max 10000).
x <= 10000Response format: json (default) or csv.
json, csv