cURL
curl -X GET "https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5"fetch("https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5")
.then(response => response.json())
.then(data => console.log(data))require('axios')
.get("https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5")
.then(response => console.log(response))require 'net/http'
uri = URI("https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5")
res = Net::HTTP.get_response(uri)
puts res.bodyimport requests
url = "https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5"
print(requests.get(url).json())<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://consensus.cryptoquant.com/api/v1/analysts/top",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://consensus.cryptoquant.com/api/v1/analysts/top"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://consensus.cryptoquant.com/api/v1/analysts/top")
.asString();{
"asset": "BTC",
"asset_name": "Bitcoin",
"asset_class": "crypto",
"as_of": "2026-10-06T07:48:27.635Z",
"scored": true,
"ranking": "accuracy_score desc among analysts active in the last three calendar months (ties: sample size, then handle)",
"tier_asset_class": "crypto",
"count": 1,
"total_ranked": 72,
"total_tracked": 125,
"analysts": [
{
"rank": 1,
"tier": {
"asset_class": "crypto",
"tier": 1,
"badge": "top1",
"label": "Top 1%",
"eligible": true,
"reason": null,
"pool_rank": 2,
"pool_size": 108,
"percentile": 1.8519,
"score_version": "v20",
"computed_at": "2026-10-06T00:59:17.501379+00:00"
},
"handle": "CarpeNoctom",
"name": "CarpeNoctom",
"profile_url": "https://consensus.cryptoquant.com/analyst/CarpeNoctom",
"source_url": "https://x.com/CarpeNoctom",
"sources": [
"twitter"
],
"role": "PM & Head of Trading",
"company": "Canary Capital",
"category": null,
"citation_count": null,
"accuracy_score": 69.9,
"accuracy_sample_size": 2081,
"call_count": 5374,
"bull_score": 76,
"bear_score": 50.3,
"short_score": 51,
"long_score": 63.3,
"balanced_score": 50.3,
"bullish_bias_pct": 54,
"bias": "balanced",
"last_post_at": "2026-10-02T21:04:12+00:00"
}
],
"score_notes": {
"accuracy_score": "Overall accuracy, 0–100: an Empirical-Bayes-adjusted hit rate of the analyst's directional calls against subsequent price moves, shrunk toward the pool mean when the sample is small. Comparative — rank analysts on the same asset by it; it is NOT a win probability.",
"accuracy_sample_size": "Number of evaluated calls behind accuracy_score. Treat scores with a sample below ~10 as weak evidence."
},
"list_url": "https://consensus.cryptoquant.com/analysts?asset=btc&sort=accuracy",
"methodology_url": "https://consensus.cryptoquant.com/methodology",
"docs_url": "https://consensus.cryptoquant.com/docs/api#analyst-track-record"
}{
"error": "Unknown asset",
"code": "UNKNOWN_ASSET",
"message": "\"DOGE2\" is not a registered asset. Use a ticker, route key or name from https://consensus.cryptoquant.com/api/v1/assets (symbol / key / name / aliases, case-insensitive). Market aggregates are not assets.",
"docs_url": "https://consensus.cryptoquant.com/docs/api#errors",
"param": "asset"
}{
"error": "Analyst list unavailable",
"code": "SERVICE_UNAVAILABLE",
"message": "The analyst list could not be loaded. Try again shortly.",
"docs_url": "https://consensus.cryptoquant.com/docs/api#errors"
}Endpoints
Top Analysts
The asset’s analysts ranked by accuracy_score among those active in the last three calendar months, each with its tier badge. Public, no API key.
GET
/
analysts
/
top
cURL
curl -X GET "https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5"fetch("https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5")
.then(response => response.json())
.then(data => console.log(data))require('axios')
.get("https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5")
.then(response => console.log(response))require 'net/http'
uri = URI("https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5")
res = Net::HTTP.get_response(uri)
puts res.bodyimport requests
url = "https://consensus.cryptoquant.com/api/v1/analysts/top?asset=BTC&limit=5"
print(requests.get(url).json())<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://consensus.cryptoquant.com/api/v1/analysts/top",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://consensus.cryptoquant.com/api/v1/analysts/top"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://consensus.cryptoquant.com/api/v1/analysts/top")
.asString();{
"asset": "BTC",
"asset_name": "Bitcoin",
"asset_class": "crypto",
"as_of": "2026-10-06T07:48:27.635Z",
"scored": true,
"ranking": "accuracy_score desc among analysts active in the last three calendar months (ties: sample size, then handle)",
"tier_asset_class": "crypto",
"count": 1,
"total_ranked": 72,
"total_tracked": 125,
"analysts": [
{
"rank": 1,
"tier": {
"asset_class": "crypto",
"tier": 1,
"badge": "top1",
"label": "Top 1%",
"eligible": true,
"reason": null,
"pool_rank": 2,
"pool_size": 108,
"percentile": 1.8519,
"score_version": "v20",
"computed_at": "2026-10-06T00:59:17.501379+00:00"
},
"handle": "CarpeNoctom",
"name": "CarpeNoctom",
"profile_url": "https://consensus.cryptoquant.com/analyst/CarpeNoctom",
"source_url": "https://x.com/CarpeNoctom",
"sources": [
"twitter"
],
"role": "PM & Head of Trading",
"company": "Canary Capital",
"category": null,
"citation_count": null,
"accuracy_score": 69.9,
"accuracy_sample_size": 2081,
"call_count": 5374,
"bull_score": 76,
"bear_score": 50.3,
"short_score": 51,
"long_score": 63.3,
"balanced_score": 50.3,
"bullish_bias_pct": 54,
"bias": "balanced",
"last_post_at": "2026-10-02T21:04:12+00:00"
}
],
"score_notes": {
"accuracy_score": "Overall accuracy, 0–100: an Empirical-Bayes-adjusted hit rate of the analyst's directional calls against subsequent price moves, shrunk toward the pool mean when the sample is small. Comparative — rank analysts on the same asset by it; it is NOT a win probability.",
"accuracy_sample_size": "Number of evaluated calls behind accuracy_score. Treat scores with a sample below ~10 as weak evidence."
},
"list_url": "https://consensus.cryptoquant.com/analysts?asset=btc&sort=accuracy",
"methodology_url": "https://consensus.cryptoquant.com/methodology",
"docs_url": "https://consensus.cryptoquant.com/docs/api#analyst-track-record"
}{
"error": "Unknown asset",
"code": "UNKNOWN_ASSET",
"message": "\"DOGE2\" is not a registered asset. Use a ticker, route key or name from https://consensus.cryptoquant.com/api/v1/assets (symbol / key / name / aliases, case-insensitive). Market aggregates are not assets.",
"docs_url": "https://consensus.cryptoquant.com/docs/api#errors",
"param": "asset"
}{
"error": "Analyst list unavailable",
"code": "SERVICE_UNAVAILABLE",
"message": "The analyst list could not be loaded. Try again shortly.",
"docs_url": "https://consensus.cryptoquant.com/docs/api#errors"
}What it returns
The asset’s analysts ranked byaccuracy_score among those active in the last three calendar
months. asset = any registered asset (default BTC); limit 1–50 (default 20).
Each row carries its tier badge (Top 1% / 5% / 10% / Tracked — quote the badge, not the score).
Accuracy scoring covers crypto today: for stocks, ETFs and commodities the list is returned
with
scored: false and null scores.Access
Public — no API key, no session. Responses are CDN-cached for one hour and carryscore_notes
explaining every number.
Reading the scores
Scores are comparative 0–100 values, not win probabilities — see the Methodology.accuracy_score— overall accuracy, 0–100: an Empirical-Bayes-adjusted hit rate of the analyst’s directional calls against subsequent price moves, shrunk toward the pool mean when the sample is small. Rank analysts on the same asset by it.accuracy_sample_size— number of evaluated calls behindaccuracy_score. Treat scores with a sample below ~10 as weak evidence.
Building an agent tool? The same call backs the CryptoQuant MCP tool
get_top_analysts — see
For AI Agents.Query Parameters
Registered asset symbol or route key (BTC, ETH, SOL, NVDA, 005930 …), case-insensitive. Unknown → 400 UNKNOWN_ASSET.
Rows to return, clamped to 1–50 silently; unparsable = 20.
Required range:
1 <= x <= 50Response
Ranked analysts
Available options:
crypto, equities, indices, commodities false = accuracy scoring does not cover this asset yet; scores are null and the order is the list order.
Plain-language statement of the sort rule.
The asset class each entry's tier was read for.
Available options:
crypto, equities, indices, commodities, macro Required range:
x >= 0Required range:
x >= 0Required range:
x >= 0Show child attributes
Show child attributes
What each score field means — quote the caveat with the number.
Show child attributes
Show child attributes