curl -X GET "https://consensus.cryptoquant.com/api/v1/sentiment?handle=caprioleio&asset=BTC&days=30" \
-H "X-API-Key: <YOUR_API_KEY>"fetch("https://consensus.cryptoquant.com/api/v1/sentiment?handle=caprioleio&asset=BTC&days=30", { headers: { "X-API-Key": "<YOUR_API_KEY>"} })
.then(response => response.json())
.then(data => console.log(data))require('axios')
.get("https://consensus.cryptoquant.com/api/v1/sentiment?handle=caprioleio&asset=BTC&days=30", { headers: { 'X-API-Key': '<YOUR_API_KEY>' } })
.then(response => console.log(response))require 'net/http'
uri = URI("https://consensus.cryptoquant.com/api/v1/sentiment?handle=caprioleio&asset=BTC&days=30")
req = Net::HTTP::Get.new(uri)
req["X-API-Key"] = "<YOUR_API_KEY>"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.bodyimport requests
headers = {'X-API-Key': '<YOUR_API_KEY>'}
url = "https://consensus.cryptoquant.com/api/v1/sentiment?handle=caprioleio&asset=BTC&days=30"
print(requests.get(url, headers=headers).json())<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://consensus.cryptoquant.com/api/v1/sentiment",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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/sentiment"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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/sentiment")
.header("X-API-Key", "<api-key>")
.asString();{
"analyst_id": "c897b6ac-0cf2-41f2-98d5-84b7464cef41",
"asset": "BTC",
"period": {
"start": "2026-10-04",
"end": "2026-10-05"
},
"count": 2,
"data": [
{
"date": "2026-10-04",
"sentiment_score": 80,
"sentiment_score_key_calls": null,
"key_calls_count": 7
},
{
"date": "2026-10-05",
"sentiment_score": 82,
"sentiment_score_key_calls": null,
"key_calls_count": 5
}
]
}Analyst Stance
One analyst’s daily stance on one asset, oldest first — each sentiment_score from 0 (bearish) to 100 (bullish). Premium and Enterprise keys.
curl -X GET "https://consensus.cryptoquant.com/api/v1/sentiment?handle=caprioleio&asset=BTC&days=30" \
-H "X-API-Key: <YOUR_API_KEY>"fetch("https://consensus.cryptoquant.com/api/v1/sentiment?handle=caprioleio&asset=BTC&days=30", { headers: { "X-API-Key": "<YOUR_API_KEY>"} })
.then(response => response.json())
.then(data => console.log(data))require('axios')
.get("https://consensus.cryptoquant.com/api/v1/sentiment?handle=caprioleio&asset=BTC&days=30", { headers: { 'X-API-Key': '<YOUR_API_KEY>' } })
.then(response => console.log(response))require 'net/http'
uri = URI("https://consensus.cryptoquant.com/api/v1/sentiment?handle=caprioleio&asset=BTC&days=30")
req = Net::HTTP::Get.new(uri)
req["X-API-Key"] = "<YOUR_API_KEY>"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.bodyimport requests
headers = {'X-API-Key': '<YOUR_API_KEY>'}
url = "https://consensus.cryptoquant.com/api/v1/sentiment?handle=caprioleio&asset=BTC&days=30"
print(requests.get(url, headers=headers).json())<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://consensus.cryptoquant.com/api/v1/sentiment",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$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/sentiment"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
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/sentiment")
.header("X-API-Key", "<api-key>")
.asString();{
"analyst_id": "c897b6ac-0cf2-41f2-98d5-84b7464cef41",
"asset": "BTC",
"period": {
"start": "2026-10-04",
"end": "2026-10-05"
},
"count": 2,
"data": [
{
"date": "2026-10-04",
"sentiment_score": 80,
"sentiment_score_key_calls": null,
"key_calls_count": 7
},
{
"date": "2026-10-05",
"sentiment_score": 82,
"sentiment_score_key_calls": null,
"key_calls_count": 5
}
]
}What it returns
One analyst’s daily stance on one asset, oldest first. Eachsentiment_score ranges from 0
(bearish) to 100 (bullish).
Access
Per-analyst data is available on the Premium and Enterprise plans; a Free key answers401 PLAN_REQUIRED. Valid handles come from /analysts/top or the
analysts page.
Parameters
| Name | Default | Description |
|---|---|---|
handle | — | Analyst handle (required unless analyst_id is given); case-insensitive. |
analyst_id | — | Analyst UUID (alternative to handle; wins when both are given). |
asset | BTC | Any registered asset (see /assets). A pair with no rows answers count: 0. |
days | 30 | Days of history ending yesterday UTC; capped at 36,500. |
Notes
sentiment_score_key_callsandkey_calls_countdescribe the analyst’s key calls that day;sentiment_score_key_callsisnullwhen there are none.- No tracked analyst matching
handleanswers404 ANALYST_NOT_FOUND; an analyst excluded from the stance pipeline answers404 ANALYST_NOT_ELIGIBLE; no rows for the analyst × asset pair in the range answers404 NO_DATA— see Errors.
Authorizations
Provisioned with the CryptoQuant Premium plan or an Enterprise agreement (no self-serve). Keys start with unbias_live_.
Query Parameters
Analyst handle (required unless analyst_id is given); valid handles come from /analysts/top. Case-insensitive.
Analyst UUID (alternative to handle; wins when both are given).
Any registered asset, case-insensitive: the symbol (BTC, NVDA, 005930, XAU), the route key (bitcoin, samsung-electronics), the display name (Bitcoin), an alias ticker (GLD → XAU) or a retired ticker (MATIC → POL). The response reports the canonical symbol. The full list: GET /assets. A market aggregate (crypto-market) is not accepted. Unknown → 400 UNKNOWN_ASSET.
Days of history ending yesterday UTC. Positive integer (else 400 INVALID_PARAMETER); silently capped at the plan's max_days_history (36500 on premium / enterprise).
1 <= x <= 36500Response
Series (premium / enterprise: StanceSeries). StanceLatest is the reserved free-plan shape (not served today).