Contents
Blockmetric Sentiment index
Blockmetric Sentiment: our own 0–100 market sentiment index (0 extreme fear, 100 extreme greed) from data we collect: BTC price momentum and volatility, funding of BTC and ETH perpetuals on Binance and Bybit, BTC open interest change, the Binance long/short account ratio, the liquidation imbalance and the positioning of tracked Hyperliquid whales.
/api/v1/sentimentEvery keyDescription
Every input is ranked against its own daily values of the previous 365 days and weighted (method, /methodology#sentiment); an input without enough history or data is left out and the others are renormalised (status collecting, missing or off). Returns the current value (recomputed every 15 minutes; daily = true when it is the latest 00:00 UTC value) with the score and points of every input, and the daily history at 00:00 UTC. Inputs leave only as scores, never as raw values.
Who can call it
Available with every key and keyless (X-Blockmetric-Access: public). Keys of Free accounts get free-tier data (real-time feeds, 30 days of history, heatmap over time for every coin over the last 24 hours, liquidation levels now for every coin, the same as the free web plan); Pro and Desk keys the data of their plan; API Dev / API Pro raise the limits.
- No key
- 24 h
- Free
- 30 days
- Pro
- 365 days
- Desk
- 1095 days
- API Dev
- 365 days
- API Pro
- 1095 days
History window per plan. Limits: Authentication & limits.
Parameters
| Parameter | Description |
|---|---|
daysinteger | Days of daily history, default 90, clamped to 1–1095 and to the plan history (free key 30 days, keyless 24 h).1–1095 · default 90 |
Response fields
Every success is { data, meta }; these are the fields of data. meta is the same on every endpoint.
| Field | Description |
|---|---|
namestring | Always "Blockmetric Sentiment". |
currentobject · nullable | Current value with its breakdown; null while less than method.minWeight of the weight has enough history. |
current.atstring (ISO 8601) | Time of the value. |
current.scorenumber | 0–100. |
current.label"Extreme fear" | "Fear" | "Neutral" | "Greed" | "Extreme greed" | - |
current.dailyboolean | true: no fresh intraday value, this is the latest daily value at 00:00 UTC. |
current.weightUsedinteger | Sum of the weights of the inputs that counted (of 100; at least method.minWeight). |
current.components[]array of objects | Affected parts of the service. |
current.components[].idstring (enum) | Stable id of the item; on paginated feeds the order key together with ts. |
current.components[].namestring | Name of the input, e.g. "Price momentum". |
current.components[].weightinteger | Fixed weight of the input (of 100). |
current.components[].status"ok" | "collecting" | "missing" | "off" | ok = counted; collecting = fewer than method.minSamples earlier daily values; missing = no data for the period; off = a source of it is switched off. |
current.components[].samplesinteger | Earlier daily values in the 365-day lookback. |
current.components[].scorenumber · nullable | 0–100: percentile against its own lookback (volatility inverted); null unless ok. |
current.components[].pointsnumber · nullable | Points this input adds to the total (weight renormalised over the counted inputs); null unless ok. |
history[]array of objects | Daily values at 00:00 UTC, oldest first; days without a score are left out. |
history[].daystring | UTC date of the 00:00 value (YYYY-MM-DD). |
history[].atstring (ISO 8601) | 00:00 UTC of that day. |
history[].scorenumber | 0–100. |
history[].label"Extreme fear" | "Fear" | "Neutral" | "Greed" | "Extreme greed" | - |
history[].weightUsedinteger | Sum of the weights of the inputs that counted (of 100). |
firstDaystring · nullable | First day with a score. |
methodobject | The fixed rules of the index (/methodology#sentiment). |
method.lookbackDaysinteger | Days of daily values every input is ranked against. |
method.minSamplesinteger | Earlier daily values an input needs before it counts. |
method.minWeightinteger | Minimum weight (of 100) of the counted inputs for a value. |
method.bands[]array of objects | Label bands on the rounded score. |
method.bands[].frominteger | Lowest rounded score of the band. |
method.bands[].tointeger | Highest rounded score of the band. |
method.bands[].label"Extreme fear" | "Fear" | "Neutral" | "Greed" | "Extreme greed" | - |
Errors
- 400
invalid_paramInvalid parameter - 401
unauthorizedMissing or invalid API key - 403
plan_requiredPlan does not include this - 403
scope_requiredKey not scoped for this API - 403
ip_not_allowedAddress not on the IP allowlist of the key - 403
origin_not_allowedKey used from a browser origin it does not allow - 403
source_restrictedExchange data not redistributed - 403
https_requiredhttps required - 429
rate_limitedPer-minute limit reachedretry - 429
daily_limit_exceededDaily limit reachedretry - 429
stream_limitToo many open streamsretry - 500
internal_errorInternal errorretry
Code snippets in these docs are licensed under MIT-0: copy them into your own code without attribution. The SDKs, CLI and MCP server will be, once published, Apache-2.0; the name Blockmetric is not licensed (forks must be renamed). Data from the API is governed by the API terms; third-party exchange data by the exchange’s terms.