cURL
curl -X GET "https://consensus.cryptoquant.com/api/v1/analysts/caprioleio"fetch("https://consensus.cryptoquant.com/api/v1/analysts/caprioleio")
.then(response => response.json())
.then(data => console.log(data))require('axios')
.get("https://consensus.cryptoquant.com/api/v1/analysts/caprioleio")
.then(response => console.log(response))require 'net/http'
uri = URI("https://consensus.cryptoquant.com/api/v1/analysts/caprioleio")
res = Net::HTTP.get_response(uri)
puts res.bodyimport requests
url = "https://consensus.cryptoquant.com/api/v1/analysts/caprioleio"
print(requests.get(url).json())<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://consensus.cryptoquant.com/api/v1/analysts/{handle}",
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/{handle}"
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/{handle}")
.asString();{
"handle": "caprioleio",
"name": "Charles Edwards",
"slug": "caprioleio",
"profile_url": "https://consensus.cryptoquant.com/analyst/caprioleio",
"source_url": "https://x.com/caprioleio",
"sources": [
"twitter"
],
"role": "Founder & CEO",
"company": "Capriole Investments",
"follower_count": 0,
"is_verified": false,
"category": "macro",
"activity": {
"last_activity_at": "2026-10-02T12:34:42+00:00",
"active_last_3_months": true
},
"track_record": {
"accuracy_score": 70.8,
"accuracy_sample_size": 1624,
"call_count": 2276,
"bull_score": 89.8,
"bear_score": 39.8,
"short_score": 63.9,
"long_score": 77,
"balanced_score": 39.8,
"overall_rank": {
"rank": 6,
"total": 109
},
"category_ranks": {
"bull": {
"rank": 1,
"total": 111
},
"bear": {
"rank": 51,
"total": 111
},
"short": {
"rank": 20,
"total": 91
},
"long": {
"rank": 29,
"total": 111
}
},
"best_ranking": {
"category": "bull",
"rank": 1,
"label": "Bull Accuracy",
"priority": 2
},
"scored": true,
"tier": {
"asset_class": "crypto",
"tier": 1,
"badge": "top1",
"label": "Top 1%",
"eligible": true,
"reason": null,
"pool_rank": 7,
"pool_size": 106,
"percentile": 6.6038,
"score_version": "v20r-btc-amp31-dir",
"computed_at": "2026-10-02T21:16:07.550877+00:00"
},
"tiers": {
"crypto": {
"asset_class": "crypto",
"tier": 1,
"badge": "top1",
"label": "Top 1%",
"eligible": true,
"reason": null,
"pool_rank": 7,
"pool_size": 106,
"percentile": 6.6038,
"score_version": "v20r-btc-amp31-dir",
"computed_at": "2026-10-02T21:16:07.550877+00:00"
}
}
},
"calls": {
"total": 1778,
"bullish": 1160,
"bearish": 618,
"neutral": 542,
"by_source": {
"x": 1778,
"cryptoquant": 0,
"news": 0,
"tradingview": 0,
"seekingalpha": 0,
"substack": 0,
"benzinga": 0,
"other": 0
},
"definition": "A call is one directional (bullish or bearish) item about one tracked asset, over the whole stored history: X posts, TradingView ideas, Seeking Alpha articles (title + summary), Substack posts and sell-side analyst ratings. An article on several tickers is one call per ticker on each asset page and counts once per article × ticker pair in its author's total.",
"recent_bullish_bias_pct": 70,
"recent_bias": "bullish"
},
"covered_assets": [
{
"symbol": "BTC",
"asset_class": "crypto",
"last_post_at": "2026-09-23T04:02:49+00:00"
},
{
"symbol": "SPY",
"asset_class": "indices",
"last_post_at": "2026-08-05T06:40:15+00:00"
}
],
"citation_count": null,
"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."
},
"methodology_url": "https://consensus.cryptoquant.com/methodology",
"docs_url": "https://consensus.cryptoquant.com/docs/api#analyst-track-record",
"as_of": "2026-10-06T07:48:28.011Z"
}{
"error": "Analyst not found",
"code": "ANALYST_NOT_FOUND",
"message": "No tracked analyst \"nobody\". Valid handles are listed by GET https://consensus.cryptoquant.com/api/v1/analysts/top?asset=<symbol>.",
"docs_url": "https://consensus.cryptoquant.com/docs/api#errors"
}Endpoints
Analyst Track Record
One analyst’s accuracy record — scores and ranks, tier per asset class, call counts by source platform, recent bias, covered assets and where they publish. Public, no API key.
GET
/
analysts
/
{handle}
cURL
curl -X GET "https://consensus.cryptoquant.com/api/v1/analysts/caprioleio"fetch("https://consensus.cryptoquant.com/api/v1/analysts/caprioleio")
.then(response => response.json())
.then(data => console.log(data))require('axios')
.get("https://consensus.cryptoquant.com/api/v1/analysts/caprioleio")
.then(response => console.log(response))require 'net/http'
uri = URI("https://consensus.cryptoquant.com/api/v1/analysts/caprioleio")
res = Net::HTTP.get_response(uri)
puts res.bodyimport requests
url = "https://consensus.cryptoquant.com/api/v1/analysts/caprioleio"
print(requests.get(url).json())<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://consensus.cryptoquant.com/api/v1/analysts/{handle}",
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/{handle}"
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/{handle}")
.asString();{
"handle": "caprioleio",
"name": "Charles Edwards",
"slug": "caprioleio",
"profile_url": "https://consensus.cryptoquant.com/analyst/caprioleio",
"source_url": "https://x.com/caprioleio",
"sources": [
"twitter"
],
"role": "Founder & CEO",
"company": "Capriole Investments",
"follower_count": 0,
"is_verified": false,
"category": "macro",
"activity": {
"last_activity_at": "2026-10-02T12:34:42+00:00",
"active_last_3_months": true
},
"track_record": {
"accuracy_score": 70.8,
"accuracy_sample_size": 1624,
"call_count": 2276,
"bull_score": 89.8,
"bear_score": 39.8,
"short_score": 63.9,
"long_score": 77,
"balanced_score": 39.8,
"overall_rank": {
"rank": 6,
"total": 109
},
"category_ranks": {
"bull": {
"rank": 1,
"total": 111
},
"bear": {
"rank": 51,
"total": 111
},
"short": {
"rank": 20,
"total": 91
},
"long": {
"rank": 29,
"total": 111
}
},
"best_ranking": {
"category": "bull",
"rank": 1,
"label": "Bull Accuracy",
"priority": 2
},
"scored": true,
"tier": {
"asset_class": "crypto",
"tier": 1,
"badge": "top1",
"label": "Top 1%",
"eligible": true,
"reason": null,
"pool_rank": 7,
"pool_size": 106,
"percentile": 6.6038,
"score_version": "v20r-btc-amp31-dir",
"computed_at": "2026-10-02T21:16:07.550877+00:00"
},
"tiers": {
"crypto": {
"asset_class": "crypto",
"tier": 1,
"badge": "top1",
"label": "Top 1%",
"eligible": true,
"reason": null,
"pool_rank": 7,
"pool_size": 106,
"percentile": 6.6038,
"score_version": "v20r-btc-amp31-dir",
"computed_at": "2026-10-02T21:16:07.550877+00:00"
}
}
},
"calls": {
"total": 1778,
"bullish": 1160,
"bearish": 618,
"neutral": 542,
"by_source": {
"x": 1778,
"cryptoquant": 0,
"news": 0,
"tradingview": 0,
"seekingalpha": 0,
"substack": 0,
"benzinga": 0,
"other": 0
},
"definition": "A call is one directional (bullish or bearish) item about one tracked asset, over the whole stored history: X posts, TradingView ideas, Seeking Alpha articles (title + summary), Substack posts and sell-side analyst ratings. An article on several tickers is one call per ticker on each asset page and counts once per article × ticker pair in its author's total.",
"recent_bullish_bias_pct": 70,
"recent_bias": "bullish"
},
"covered_assets": [
{
"symbol": "BTC",
"asset_class": "crypto",
"last_post_at": "2026-09-23T04:02:49+00:00"
},
{
"symbol": "SPY",
"asset_class": "indices",
"last_post_at": "2026-08-05T06:40:15+00:00"
}
],
"citation_count": null,
"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."
},
"methodology_url": "https://consensus.cryptoquant.com/methodology",
"docs_url": "https://consensus.cryptoquant.com/docs/api#analyst-track-record",
"as_of": "2026-10-06T07:48:28.011Z"
}{
"error": "Analyst not found",
"code": "ANALYST_NOT_FOUND",
"message": "No tracked analyst \"nobody\". Valid handles are listed by GET https://consensus.cryptoquant.com/api/v1/analysts/top?asset=<symbol>.",
"docs_url": "https://consensus.cryptoquant.com/docs/api#errors"
}What it returns
One analyst’s record:accuracy_score, accuracy_sample_size, bull / bear / short / long scores
with their ranks, overall_rank, the tier per asset class, call counts split by source platform
(calls.by_source) with the definition of a call, recent bias, covered assets, the profile URL and
where they publish.
{handle} is the X handle, the platform handle or the /analyst/{slug} page slug.
Access
Public — no API key, no session. Responses are CDN-cached for one hour and carryscore_notes
explaining every number. Scores are comparative 0–100 values, not win probabilities — see the
Methodology.
Notes
- A call is one directional (bullish or bearish) item about one tracked asset, over the whole stored history: X posts, TradingView ideas, Seeking Alpha articles (title + summary), Substack posts and sell-side analyst ratings. An article on several tickers is one call per ticker on each asset page and counts once per article × ticker pair in its author’s total.
calls.by_sourcekeys are thesource_platformvalues;sources[]uses theanalyst_sourcevalues (twitter= X).tier/tierscarry the badge key (top1·top5·top10·tracked), the pool rank and size, and areasonwhen the tier isnull— seetier_reason.- No tracked analyst matching
{handle}answers404 ANALYST_NOT_FOUND.
Building an agent tool? The same call backs the CryptoQuant MCP tool
get_analyst_profile — see
For AI Agents.Path Parameters
X handle / page slug / platform:slug id (case-insensitive).
Response
Track record
X handle, or <platform>:<slug> for a platform-only analyst.
The analyst page on the site (cite this).
Stored provenance of the analyst row (twitter = X).
Available options:
twitter, cryptoquant, seekingalpha, tradingview, substack, other Page slug (/analyst/<slug>).
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Most recent post first.
Show child attributes
Show child attributes
Where the analyst publishes (X, CryptoQuant, TradingView, Seeking Alpha, Substack).
Analyst category label (e.g. technical, macro); free text, null when unset.
Required range:
x >= 0Required range:
x >= 0Show child attributes
Show child attributes