Zum Hauptinhalt springen

Snapshot-API

Die Snapshot-API rendert On-Chain-Analytics-Charts als PNG-Bilder oder SVG-Vektorgrafiken. Senden Sie Metrik-IDs und optionale Darstellungsparameter und erhalten Sie ein vollständig gerendertes Chartbild, das sich direkt in Berichte, Dashboards oder KI-Konversationen einbetten lässt. Derzeit werden Bitcoin-Metriken unterstützt, die Multi-Chain-Abdeckung (ETH, TON, TRON) wird ausgebaut.

Endpunkte

MethodePfadBeschreibung
GET/v1/chart/snapshotEinfache Charts über Query-Parameter
POST/v1/chart/snapshotVollständige Anpassung über JSON-Body

Beide Endpunkte liefern standardmäßig image/png. Wechseln Sie zu SVG (image/svg+xml) oder JSON-Metadaten (application/json), indem Sie den Accept-Request-Header setzen oder — bei POST — das Body-Feld format ("png", "svg", "json").

Erfolgreiche PNG- und SVG-Antworten enthalten einen X-Render-Id-Header, sodass der gerenderte Chart innerhalb von 1 Stunde erneut per URL abgerufen werden kann:

AusgabeGecacht unter
PNGhttps://api.blocklens.co/v1/chart/renders/{X-Render-Id}.png
SVGhttps://api.blocklens.co/v1/chart/renders/{X-Render-Id}.svg

Authentifizierung

Alle Anfragen erfordern einen API-Schlüssel über den Authorization-Header:

Authorization: Bearer YOUR_API_KEY

Siehe Authentifizierung für Details zum Bezug von API-Schlüsseln.

Zugriff & Rate-Limits

Die Snapshot-API erfordert die Stufe Pro oder Enterprise. Schlüssel der Demo- und Free-Stufe erhalten 403 Forbidden.

Die Snapshot-API folgt denselben Rate-Limits wie die Data-API. Siehe Rate-Limits für Details.

Bei Überschreitung des Rate-Limits liefert die API 429 Too Many Requests mit einem retry_after-Feld.

Der Metrikzugriff ist zudem nach Klasse gestaffelt: Metriken der Klasse 0 (Price, Supply, MVRV) stehen allen Pro+-Schlüsseln zur Verfügung, Metriken der Klasse 1 (SOPR, P&L) erfordern Pro, und Metriken der Klasse 2 (CBD-Heatmaps) erfordern Enterprise.


GET /v1/chart/snapshot

Erzeugt einen Chart aus Query-Parametern. Am besten geeignet für einfache, einzelne Metrik- oder vorlagenbasierte Charts.

Parameter

ParameterTypStandardBeschreibung
metricstring-Einzelne Metrik-ID (z. B. price, lth_supply). Schließt sich mit metrics und template gegenseitig aus.
metricsstring-Kommagetrennte Metrik-IDs, maximal 6 (z. B. lth_supply,sth_supply). Schließt sich mit metric und template gegenseitig aus.
templatestring-Vordefinierte Vorlagen-ID. Schließt sich mit metric und metrics gegenseitig aus.
daysinteger365Tage historischer Daten (7–10000).
start_datestring-Startdatum (YYYY-MM-DD). Überschreibt days.
end_datestring-Enddatum (YYYY-MM-DD). Standardmäßig heute.
stylestringautoChartstil: line, area, bar. Wird automatisch aus der Metrik-Registry erkannt, wenn weggelassen.
scalestringlinearY-Achsen-Skala: linear oder log.
overlaystring-Fügt ein Preis-Overlay als dezente gestrichelte Linie auf der rechten Achse hinzu (Wert price verwenden). Derzeit BTC-Preis.
widthinteger1200Bildbreite in Pixeln (600–2400).
heightinteger600Bildhöhe in Pixeln (300–1200).
titlestringautoCharttitel. Wird automatisch aus den Metriknamen erzeugt, wenn weggelassen.
themestringlightFarbschema: light oder dark.

Genau eines von metric, metrics oder template muss angegeben werden.

Verfügbare Vorlagen

VorlageMetriken
priceBTC-Preis
price_volumePreis + Volumen
market_capMarket Cap
holder_supplyLTH Supply + STH Supply
mvrv_ratioLTH MVRV + STH MVRV
realized_priceLTH Realized Price + STH Realized Price
realized_capLTH Realized Cap + STH Realized Cap
unrealized_plLTH Unrealized P/L + STH Unrealized P/L
realized_plLTH Realized P/L + STH Realized P/L
soprLTH SOPR + STH SOPR
block_heightBlock Height

Beispiele

# Bitcoin example: BTC price, 1 year, line chart
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.blocklens.co/v1/chart/snapshot?metric=price" \
--output price.png

# Bitcoin example: two metrics with area style
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.blocklens.co/v1/chart/snapshot?metrics=lth_supply,sth_supply&style=area&days=730" \
--output supply.png

# Template with dark theme
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.blocklens.co/v1/chart/snapshot?template=mvrv_ratio&theme=dark" \
--output mvrv_dark.png

# Log scale with price overlay
curl -H "Authorization: Bearer YOUR_KEY" \
"https://api.blocklens.co/v1/chart/snapshot?metric=lth_supply&scale=log&overlay=price&days=1095" \
--output supply_with_price.png

# Get JSON metadata instead of image
curl -H "Authorization: Bearer YOUR_KEY" \
-H "Accept: application/json" \
"https://api.blocklens.co/v1/chart/snapshot?metric=price" | jq

# Get SVG instead of PNG
curl -H "Authorization: Bearer YOUR_KEY" \
-H "Accept: image/svg+xml" \
"https://api.blocklens.co/v1/chart/snapshot?metric=price" \
--output price.svg

Erfolgsantwort

PNG (Standard):

HTTP/1.1 200 OK
Content-Type: image/png
Cache-Control: public, max-age=3600
X-Snapshot-Cache: HIT
X-Snapshot-Render-Ms: 0
X-Render-Id: 0a1b2c3d4e5f6789

<binary PNG data>

SVG (mit Accept: image/svg+xml):

HTTP/1.1 200 OK
Content-Type: image/svg+xml
Cache-Control: public, max-age=3600
X-Snapshot-Cache: MISS
X-Snapshot-Render-Ms: 412
X-Render-Id: 0a1b2c3d4e5f6789
Content-Disposition: attachment; filename="chart.svg"

<svg xmlns="http://www.w3.org/2000/svg" ...>...</svg>

Der Wert von X-Render-Id kann verwendet werden, um dasselbe Bild bis zu 1 Stunde lang unter /v1/chart/renders/{render_id}.png oder /v1/chart/renders/{render_id}.svg erneut abzurufen.


POST /v1/chart/snapshot

Vollständige Chart-Anpassung über JSON-Body. Unterstützt metrikspezifisches Styling, benutzerdefinierte Achsen, Formeln, Referenzlinien, Referenzbereiche und mehr. Konzipiert für KI-Agenten (via MCP) und fortgeschrittene Nutzer.

Request-Body

Geben Sie genau eine Datenquelle an (metric, metrics oder template):

{
"metric": "price",

"days": 365,
"start_date": "2025-01-01",
"end_date": "2026-02-23",

"title": "Custom Chart Title",
"width": 1200,
"height": 600,
"theme": "light",
"format": "png",

"style": "line",
"scale": "linear",
"overlay": "price",

"y_axes": [
{"id": "axis-left", "side": "left", "scale": "linear", "format": "number"},
{"id": "axis-right", "side": "right", "scale": "log", "format": "currency"}
],

"formulas": [
{"expression": "sma(m1, 200)", "label": "200-day SMA", "color": "#9333ea", "style": "line"}
],

"reference_lines": [
{"y": 1.0, "stroke": "#9ca3af", "stroke_dasharray": "3 3", "label": "Break-even"}
],
"reference_areas": [
{"y1": 0, "y2": 0.85, "fill": "#16a34a", "fill_opacity": 0.08, "label": "Undervalued"}
]
}

Hinweis: Genau eines von metric, metrics oder template muss angegeben werden.

Feld metrics

Das Feld metrics unterstützt gemischte Typen:

// String shorthand
["price", "lth_supply"]

// Full config objects
[{"id": "price", "axis": "right", "style": "line", "color": "#374151"}]

// Mixed
["price", {"id": "lth_supply", "axis": "left", "style": "area"}]

// With params for parameterized metrics
[
{"id": "funding_binance", "params": {"exchange": "binance"}},
{"id": "price"}
]

Einige Metriken erfordern zusätzliche Parameter (z. B. exchange, ticker, id). Geben Sie das params-Objekt aus der Metrikdefinition an, wenn Sie diese Metriken verwenden.

Metrikspezifische Optionen

FeldTypBeschreibung
idstringErforderlich. Metrik-ID aus der Registry.
paramsobjectParameter für parametrisierte Metriken (z. B. {"exchange": "binance"}). Erforderliche Parameter siehe Metrikdefinition.
axisleft / rightSeite der Y-Achse. Wird automatisch zugewiesen, wenn weggelassen.
y_axis_idstringBindung an eine bestimmte Y-Achse per ID (z. B. axis-diff). Überschreibt axis.
styleline / area / barChartstil. Registry-Standard, wenn weggelassen.
colorstringHex-Farbe (z. B. #2563eb). Wird automatisch zugewiesen, wenn weggelassen.
labelstringAnzeigebezeichnung. Verwendet den Metriknamen, wenn weggelassen.
stroke_widthintegerLinienbreite (0–5). Standard: 2. 0 für Balken ohne Rand verwenden.
fill_opacityfloatFülldeckkraft (0.0–1.0). Für transparente Balken niedrige Werte wie 0.2 verwenden.
stroke_dashstringStrichmuster (z. B. 5 5).
stack_groupstringStack-Gruppen-ID für gestapelte Charts.
show_in_legendbooleanOb die Metrik in der Chartlegende angezeigt wird. Standard: true.
visiblebooleanEin-/ausblenden. Standard: true.

Benutzerdefinierte Y-Achsen

Das Feld y_axes definiert die für Metriken und Formeln verfügbaren Y-Achsen. Jede Achse hat eine eindeutige id, die per y_axis_id auf Metriken oder Formeln referenziert werden kann. Sie können mehr als zwei Achsen definieren — zum Beispiel eine separate Achse für berechnete Differenzen:

"y_axes": [
{"id": "axis-left", "side": "left", "scale": "linear", "format": "number"},
{"id": "axis-right", "side": "right", "scale": "log", "format": "currency"},
{"id": "axis-diff", "side": "left", "scale": "linear", "format": "number"}
]
FeldTypBeschreibung
idstringEindeutige Achsenkennung. Referenziert per y_axis_id auf Metriken/Formeln.
sideleft / rightAuf welcher Seite des Charts die Achse erscheint.
scalelinear / logAchsenskala. Standard: linear.
formatnumber / currency / percentZahlenformat für Achsenbeschriftungen.
range[number, number]Vertikale Zone als [from%, to%]. 0 = unten, 100 = oben. Standard: volle Höhe. Zum vertikalen Stapeln von Achsen verwenden (z. B. Volumen in den unteren 20 %, Preis in den oberen 80 %).
domain_minnumberHarte Untergrenze der Domain. Die Achse geht nie unter diesen Wert.
domain_maxnumberHarte Obergrenze der Domain. Die Achse geht nie über diesen Wert.
no_padding"top" / "bottom" / "both"Entfernt den automatischen 10 %-Rand an den Kanten. Nützlich, wenn eine Domain-Begrenzung eine harte Grenze ist (z. B. Drawdown bei 0 gedeckelt).

Wird y_axes weggelassen, werden die Achsen automatisch anhand der axis-Werte der Metriken erzeugt.

Beispiel: Preis + Volumen mit vertikalen Zonen

Volumenbalken in den unteren 20 % und Preis im verbleibenden Bereich stapeln:

curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"metrics": [
{"id": "price", "style": "line", "color": "#374151", "y_axis_id": "axis-price"},
{"id": "volume", "style": "bar", "color": "#3b82f6", "fill_opacity": 0.3, "stroke_width": 0, "y_axis_id": "axis-vol"}
],
"y_axes": [
{"id": "axis-price", "side": "right", "scale": "log", "format": "currency", "range": [20, 100]},
{"id": "axis-vol", "side": "left", "format": "number", "range": [0, 20], "no_padding": "bottom"}
],
"days": 365,
"title": "BTC Price + Volume (Zoned)"
}' --output price_volume_zones.png

Was dies erzeugt:

  • Volumenbalken füllen die unteren 20 % des Charts (range: [0, 20]) ohne Rand an der Unterkante
  • Der Preis belegt die oberen 80 % (range: [20, 100]) auf einer Log-Skala
  • Die beiden Reihen überlappen sich nie, was ein sauberes, gestapeltes Layout ergibt

Beispiel: Drawdown mit Domain-Begrenzung

Drawdown bei 0 (Oberkante) deckeln, sodass die Linie die Oberkante ihrer Zone berührt:

curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"metrics": ["price"],
"formulas": [
{"expression": "drawdown(price)", "label": "Drawdown from ATH", "style": "area", "color": "#dc2626", "fill_opacity": 0.15, "y_axis_id": "axis-dd"}
],
"y_axes": [
{"id": "axis-right", "side": "right", "scale": "log", "format": "currency"},
{"id": "axis-dd", "side": "left", "format": "percent", "domain_max": 0, "no_padding": "top"}
],
"days": 1825,
"title": "BTC Price + Drawdown from ATH"
}' --output drawdown.png

Was dies erzeugt:

  • Der Drawdown ist immer ≤ 0, daher deckelt domain_max: 0 die Oberkante
  • no_padding: "top" entfernt den automatischen 10 %-Rand über 0, sodass die Linie die Oberkante berührt, wenn der Drawdown 0 % beträgt
  • Der Preis liegt auf der rechten Achse mit Log-Skala

Formeln

Das Feld formulas ermöglicht es Ihnen, aus Ihren Metriken abgeleitete berechnete Reihen zu definieren. Formeln können Metriken über ihre id (z. B. lth_supply) oder über den Positionsindex (m1, m2 usw. gemäß Reihenfolge im metrics-Array) referenzieren.

"formulas": [
{
"expression": "lth_supply - shift(lth_supply, 30)",
"label": "LTH 30d Change",
"color": "#16a34a",
"style": "bar",
"y_axis_id": "axis-diff",
"fill_opacity": 0.2,
"stroke_width": 0
}
]

Unterstützte Funktionen (30 insgesamt):

Gleitende Durchschnitte & rollierende Statistiken

FunktionSyntaxBeschreibung
smasma(series, period)Einfacher gleitender Durchschnitt (SMA)
emaema(series, period)Exponentieller gleitender Durchschnitt (EMA)
medianmedian(series, period)Rollierender Median
sumsum(series, period)Rollierende Summe
stdstd(series, period)Rollierende Standardabweichung

Kumulativ

FunktionSyntaxBeschreibung
cumsumcumsum(series)Expandierende kumulative Summe
cummeancummean(series)Expandierender kumulativer Mittelwert
cummediancummedian(series)Expandierender kumulativer Median
cumstdcumstd(series)Expandierende kumulative Standardabweichung
cummaxcummax(series)Kumulatives Allzeitmaximum
cummincummin(series)Kumulatives Allzeitminimum

Veränderungen

FunktionSyntaxBeschreibung
percent_changepercent_change(series, period)Prozentuale Veränderung (Dezimal: 0.20 = +20 %)
diffdiff(series, period)Absolute Wertveränderung

Mathematik

FunktionSyntaxBeschreibung
absabs(series)Absolutwert
powpow(series, n)Potenzierung mit n
loglog(series)Logarithmus zur Basis 10
roundround(series, digits)Auf N Nachkommastellen runden
maxmax(a, b, ...)Punktweises Maximum
minmin(a, b, ...)Punktweises Minimum

Technische Indikatoren

FunktionSyntaxBeschreibung
rsirsi(series, period)Relative Strength Index (0–100)
corrcorr(s1, s2, period)Pearson-Korrelation (−1 bis 1)
drawdowndrawdown(series)Drawdown vom ATH (negativer Dezimalwert)

Risiko & Rendite

FunktionSyntaxBeschreibung
mean_returnmean_return(series, period)Annualisierte rollierende Durchschnittsrendite
realized_volrealized_vol(series, period)Annualisierte realisierte Volatilität
sharpe_ratio_arithmeticsharpe_ratio_arithmetic(series, period)Sharpe Ratio (arithmetisch)
sharpe_ratio_geometricsharpe_ratio_geometric(series, period)Sharpe Ratio (geometrisch)

Reihenmanipulation

FunktionSyntaxBeschreibung
shiftshift(series, period)Reihe um N Perioden verschieben
ifif(a, "op", b, then, else)Bedingung (op: =, !=, >, >=, <, <=)

Operatoren

Arithmetik: +, -, *, / Gruppierung: (, )

Referenzierung

  • Metriken nach Name: lth_supply + sth_supply — Metrik-IDs direkt verwenden
  • Metriken nach Position: m1 + m2 — Positionsreferenzen (m1 = erste Metrik, m2 = zweite usw.)
  • Andere Formeln: f1 * 2 — frühere Formeln referenzieren (f1 = erste Formel usw.)
  • Formeln werden der Reihe nach ausgewertet, daher kann f2 auf f1 verweisen, aber nicht umgekehrt.

Formeloptionen:

FeldTypBeschreibung
expressionstringErforderlich. Formelausdruck mit Metrik-IDs oder Positionsreferenzen (m1, m2).
labelstringErforderlich. Anzeigebezeichnung für die Legende.
colorstringHex-Farbe. Wird automatisch zugewiesen, wenn weggelassen.
styleline / area / barChartstil. Standard: line.
y_axis_idstringBindung an eine bestimmte Y-Achse per ID (z. B. axis-diff). Überschreibt axis.
axisleft / rightSeite der Y-Achse. Standard: left. Ignoriert, wenn y_axis_id gesetzt ist.
fill_opacityfloatFülldeckkraft (0.0–1.0). Für transparente Balken niedrige Werte wie 0.2 verwenden.
stroke_widthintegerLinienbreite (0–5). 0 für Balken ohne Rand verwenden.
stroke_dashstringStrichmuster (z. B. 6 3).
stack_groupstringStack-Gruppen-ID zum Stapeln mehrerer Formelreihen.

Referenzlinien & -bereiche

Referenzlinien fügen horizontale Hilfslinien hinzu, um bestimmte Werte hervorzuheben (z. B. Break-even bei 1.0, Überkauft-Schwelle). Referenzbereiche fügen schattierte Zonen hinzu, um Wertebereiche hervorzuheben (z. B. unterbewertete Zone, Bollinger-ähnliche Bänder). Beide unterstützen statische Werte und dynamische Formeln über dieselbe Formel-Engine wie das Feld formulas.

Optionen für Referenzlinien

FeldTypBeschreibung
ynumberStatischer Y-Wert.
y_formulastringFormelausdruck für dynamisches Y (z. B. "sma(m1, 200)"). Verwendet dieselbe Engine wie formulas.
y_axis_idstringY-Achsen-ID (Standard: erste linke Achse).
strokestringLinienfarbe in Hex (Standard: #9ca3af).
stroke_dasharraystringStrichmuster, z. B. "3 3" für gestrichelt.
labelstringBeschriftungstext.

Geben Sie entweder y (statisch) oder y_formula (dynamisch) an, nicht beides. Maximal 10 Referenzlinien pro Chart.

Optionen für Referenzbereiche

FeldTypBeschreibung
y1numberStatische untere Y-Grenze.
y2numberStatische obere Y-Grenze.
y1_formulastringFormel für die dynamische untere Grenze.
y2_formulastringFormel für die dynamische obere Grenze.
y_axis_idstringY-Achsen-ID (Standard: erste linke Achse).
fillstringFüllfarbe in Hex (Standard: #3b82f6).
fill_opacitynumberFülldeckkraft 0–1 (Standard: 0.1).
labelstringBeschriftungstext.

Geben Sie statische (y1/y2) oder formelbasierte (y1_formula/y2_formula) Grenzen an — Sie können sie mischen (z. B. statisches y1 mit dynamischem y2_formula). Maximal 10 Referenzbereiche pro Chart.

Beispiel: MVRV mit Wertzonen

Grüne unterbewertete Zone (0–0.85), rote überbewertete Zone (8–100) und eine gestrichelte Break-even-Linie bei 1.0 hinzufügen:

curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"metric": "mvrv",
"days": 1825,
"title": "MVRV Ratio — Value Zones",
"reference_lines": [
{"y": 1.0, "stroke": "#9ca3af", "stroke_dasharray": "3 3", "label": "Break-even"}
],
"reference_areas": [
{"y1": 0, "y2": 0.85, "fill": "#16a34a", "fill_opacity": 0.08, "label": "Undervalued"},
{"y1": 8, "y2": 100, "fill": "#dc2626", "fill_opacity": 0.08, "label": "Overvalued"}
]
}' --output mvrv_zones.png

Beispiel: Formelbasiertes Band

Ein Bollinger-ähnliches Band um die erste Formel erstellen (±10 %-Hülle):

curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"metrics": ["price"],
"days": 365,
"formulas": [
{"expression": "sma(m1, 50)", "label": "50-day SMA", "color": "#2563eb", "style": "line"}
],
"reference_areas": [
{"y1_formula": "f1 * 0.9", "y2_formula": "f1 * 1.1", "fill": "#2563eb", "fill_opacity": 0.06, "label": "±10% Band"}
],
"reference_lines": [
{"y_formula": "sma(m1, 200)", "stroke": "#9333ea", "stroke_dasharray": "6 3", "label": "200-day SMA"}
]
}' --output price_bands.png

Ausgabeformat

Das Feld format steuert die Ausgabe:

FormatContent-TypeBeschreibung
png (Standard)image/pngGerastertes Chartbild
svgimage/svg+xmlVektorgrafik (skalierbar, einbettbar)
jsonapplication/jsonChart-Metadaten (kein Rendering)

Alternativ können Sie den Accept-Header verwenden:

  • Accept: image/png - PNG (Standard)
  • Accept: image/svg+xml - SVG
  • Accept: application/json - JSON-Metadaten

JSON-Metadaten-Antwort

Bei format=json oder Accept: application/json:

{
"success": true,
"title": "BTC Price",
"metrics": [{"id": "price", "label": "BTC Price"}],
"days": 365,
"start_date": null,
"end_date": null,
"theme": "light",
"width": 1200,
"height": 600,
"formulas": [],
"data_points": 365,
"cached": false,
"render_time_ms": 0
}

Beispiele

# POST with single metric
curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"metric": "price", "days": 365}' \
--output price.png

# Multi-metric with custom styling
curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"metrics": [
{"id": "price", "axis": "right", "style": "line", "color": "#374151"},
{"id": "lth_supply", "axis": "left", "style": "area", "color": "#2563eb"}
],
"days": 730,
"title": "BTC Price vs LTH Supply",
"theme": "dark"
}' \
--output chart.png

# SVG output
curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"template": "mvrv_ratio", "format": "svg"}' \
--output mvrv.svg

# JSON metadata
curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"metric": "price", "format": "json"}' | jq

Heatmap-Rendering

Die Snapshot-API kann Heatmap-Charts für verteilungsbasierte Metriken wie die Cost Basis Distribution rendern. Heatmaps verwenden einen eigenen Satz von Parametern, getrennt von Standard-Metrik-Charts.

Heatmap-Parameter

ParameterTypStandardBeschreibung
heatmap_idstring-Heatmap-Kennung (z. B. cost-basis-distribution)
heatmap_periodstring1yZeitraum: 3m, 6m, 1y, 2y, 3y, 5y, all
heatmap_color_scalestringviridisFarbskala: viridis, plasma, inferno, magma, cividis
heatmap_y_scalestringlinearY-Achsen-Skala: linear oder log
themestringlightFarbschema: light oder dark
titlestringautoCharttitel
widthinteger1200Bildbreite in Pixeln
heightinteger600Bildhöhe in Pixeln

Beispiel

curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"heatmap_id": "cost-basis-distribution",
"heatmap_period": "1y",
"heatmap_color_scale": "viridis",
"heatmap_y_scale": "log",
"theme": "dark",
"title": "Cost Basis Distribution"
}' --output cbd_heatmap.png

Hinweis: Heatmap-Parameter (heatmap_id usw.) schließen sich mit den Standard-Metrikparametern (metric, metrics, template) gegenseitig aus. Heatmap-Metriken erfordern die Stufe Enterprise.

Die Legende der Farbskala ist im gerenderten Bild enthalten und zeigt den Wertebereich, der auf die gewählte Farbpalette abgebildet ist.


Overlay-Charts zur Zyklus-Performance

Zyklus-Performance-Charts überlagern mehrere Bitcoin-Zyklen auf derselben X-Achse, sodass Sie sie direkt vergleichbar gegenüberstellen können. Anstatt gegen Kalenderdaten zu plotten, wird der Preis jedes Zyklus auf sein eigenes Ankerereignis (Zyklustief, ATH oder Halving) indexiert und gegen die Tage seit diesem Anker geplottet.

Schalten Sie den Overlay-Modus ein, indem Sie x_axis: "day_offset" in einer POST /v1/chart/snapshot-Anfrage setzen und Zyklusmetriken im metrics-Array angeben. Der Renderer verwendet das Feld day_offset jedes Datenpunkts anstelle von date, sodass alle Zyklen auf der X-Achse bei Tag 0 beginnen.

Tick-Beschriftungen zeigen Kalenderdaten aus dem jüngsten Zyklus der gewählten Familie. Ein ATH-Overlay (cycle_ath_1cycle_ath_5) wird beispielsweise auf 2025-10-06 verankert, und die Ticks lauten Oct '25, Jan '26, Apr '26 usw. — nicht Day 0, Day 90, Day 180. Andere Zyklen im selben Chart werden auf dieselben X-Achsen-Positionen ausgerichtet, sodass ein Wert am Tick Apr '26 auf cycle_ath_3 bedeutet: „was BTC 182 Tage in den 2017er-Zyklus hinein tat“. Die Tagesnummerierung erscheint nur als Fallback wieder, wenn das Backend den Anker nicht bestimmen kann.

Ankertypen

Drei Familien von Zyklusmetriken sind verfügbar, eine pro Ankerereignis:

AnkerMetrik-ID-PräfixBeschreibungEndpunkt-Hinweis
Zyklustief → nächstes Tiefcycle_low_*Preis indexiert auf den Zyklusboden — jede Reihe startet bei 1.0 am Tiefstdatum und läuft bis zum Tief des nächsten Zyklus.endpoint: "cycle-performance?type=low"
ATH → ATHcycle_ath_*Preis indexiert auf das Allzeithoch des Zyklus — jede Reihe startet bei 1.0 am ATH-Datum und läuft bis zum nächsten ATH.endpoint: "cycle-performance?type=ath"
Halving → Halvingcycle_halving_*Preis indexiert auf den Halving-Block — jede Reihe startet bei 1.0 am Halving-Datum und läuft bis zum nächsten Halving.endpoint: "cycle-performance?type=halving"

Innerhalb einer Ankerfamilie hat jeder Zyklus dieselbe Datenform — ein Index, der bei 1.0 beginnt und price(t) / price(anchor) bis zum nächsten Ankerereignis verfolgt (oder, für den aktuellen Zyklus, bis heute). Genau das macht den Overlay-Vergleich aussagekräftig: Ein Wert von 5.0 an Tag 200 von cycle_ath_3 bedeutet „BTC stand 200 Tage nach diesem ATH beim 5-Fachen seines 2017er-ATH“.

Alle verfügbaren Zyklusmetriken

Metrik-IDAnkerdatumAnker → Enddatum
cycle_low_12011-11-182011-11-18 → 2015-01-14
cycle_low_22015-01-142015-01-14 → 2018-12-15
cycle_low_32018-12-152018-12-15 → 2022-11-21
cycle_low_42022-11-212022-11-21 → heute (aktueller Zyklus)
cycle_ath_12011-06-112011-06-11 → 2013-11-30
cycle_ath_22013-11-302013-11-30 → 2017-12-17
cycle_ath_32017-12-172017-12-17 → 2021-11-10
cycle_ath_42021-11-102021-11-10 → 2025-10-06
cycle_ath_52025-10-062025-10-06 → heute (aktueller Zyklus)
cycle_halving_12012-11-282012-11-28 → 2016-07-09
cycle_halving_22016-07-092016-07-09 → 2020-05-11
cycle_halving_32020-05-112020-05-11 → 2024-04-20
cycle_halving_42024-04-202024-04-20 → heute (aktueller Zyklus)
Validierungsregeln
  • Alle metrics müssen aus derselben Ankerfamilie stammen. Das Mischen von cycle_ath_* mit cycle_low_* (oder allem außerhalb von daily_cycle_performance) liefert 400 invalid_params.
  • Das Flag x_axis: "day_offset" ist nur für Zyklusmetriken gültig — eine Kombination mit einer anderen Metrik liefert 400 invalid_params.
  • Das Standardlimit „maximal 6 Metriken pro Chart“ gilt — wählen Sie bis zu 6 Zyklen pro Overlay.

Parameter zur Zyklus-Performance

Zusätzlich zu allen Standard-Chartparametern (days, width, height, theme, scale, format, title, y_axes, reference_lines, reference_areas, formulas usw.) verwendet der Zyklus-Overlay-Modus diese Felder:

FeldTypStandardBeschreibung
x_axis"date" / "day_offset""date"Auf "day_offset" setzen, um das Zyklus-Overlay zu aktivieren. Andernfalls ist die X-Achse kalenderdatumsbasiert.
metricsarrayerforderlich1–6 Zyklusmetrik-IDs aus derselben Ankerfamilie. Strings oder Objekte ({id, color, style, label, stroke_width, fill_opacity, show_in_legend, y_axis_id}).
daysinteger365Begrenzt den maximal gerenderten Tagesversatz (X-Achsen-Bereich, nicht Kalendertage). Auf 1500 setzen, um ~4 Jahre pro Zyklus zu sehen.
scale"linear" / "log""linear"Die Log-Skala ist fast immer das, was Sie wollen — frühe Zyklusmultiplikatoren können 100×–500× betragen, was auf linearer Skala unleserlich ist.
theme"light" / "dark""light"Das dunkle Theme ist der Dashboard-Standard für diese Charts.

Referenzlinien (reference_lines) sind auf Overlay-Charts besonders nützlich — z. B. markiert eine horizontale Linie bei y: 1.0 das Ankerniveau, y: 2.0 markiert „das 2-Fache des Ankers“ und so weiter.

Beispiel: ATH-verankertes Overlay (benutzerdefinierte Farben pro Zyklus)

Dieses Rezept entspricht dem Chart „Price Performance Since ATH“ des Dashboards — fünf Zyklen, jeder in einer eigenen Farbe, auf einer Log-Achse.

curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"metrics": [
{"id": "cycle_ath_1", "color": "#8b5cf6", "label": "2011 ATH cycle"},
{"id": "cycle_ath_2", "color": "#3b82f6", "label": "2013 ATH cycle"},
{"id": "cycle_ath_3", "color": "#22c55e", "label": "2017 ATH cycle"},
{"id": "cycle_ath_4", "color": "#f59e0b", "label": "2021 ATH cycle"},
{"id": "cycle_ath_5", "color": "#ef4444", "label": "2025 ATH cycle (current)"}
],
"x_axis": "day_offset",
"scale": "log",
"y_axes": [
{"id": "left", "side": "left", "scale": "log", "format": "number"}
],
"reference_lines": [
{"y": 1.0, "stroke": "#9ca3af", "stroke_dasharray": "3 3", "label": "ATH = 1.0"}
],
"days": 1500,
"theme": "dark",
"title": "Price Performance Since ATH"
}' --output cycle_ath.png

Beispiel: Zyklustief-Overlay (Kurzform)

Für einen schnellen Vergleich ohne zyklusspezifisches Styling übergeben Sie die Metrik-IDs als einfache Strings — die Farben stammen automatisch aus der Registry-Palette.

curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"metrics": ["cycle_low_1", "cycle_low_2", "cycle_low_3", "cycle_low_4"],
"x_axis": "day_offset",
"scale": "log",
"days": 1500,
"title": "Price Since Cycle Low"
}' --output cycle_low.png

Beispiel: Halving-verankertes Overlay

Dieselbe Form, vier Zyklen, jeweils am Halving-Ereignis verankert.

curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"metrics": [
"cycle_halving_1", "cycle_halving_2", "cycle_halving_3", "cycle_halving_4"
],
"x_axis": "day_offset",
"scale": "log",
"days": 1500,
"theme": "dark",
"title": "Price Since Halving"
}' --output cycle_halving.png

MCP-Tool-Äquivalent

Von einem KI-Agenten, der mit dem MCP-Server verbunden ist, ist derselbe Chart ein einziger Tool-Aufruf:

render_chart({
metrics: [
{ id: "cycle_ath_1", color: "#8b5cf6" },
{ id: "cycle_ath_2", color: "#3b82f6" },
{ id: "cycle_ath_3", color: "#22c55e" },
{ id: "cycle_ath_4", color: "#f59e0b" },
{ id: "cycle_ath_5", color: "#ef4444" }
],
x_axis: "day_offset",
scale: "log",
days: 1500,
theme: "dark",
title: "Price Performance Since ATH"
})

Der MCP-Server akzeptiert dasselbe x_axis-Enum, dieselben Metrik-IDs und dieselben Validierungsregeln wie die HTTP-API.


Legendensteuerung pro Metrik

Verwenden Sie show_in_legend auf einzelnen Metrik-Konfigurationsobjekten, um zu steuern, ob eine Metrik in der Chartlegende erscheint. Das ist nützlich, wenn viele Reihen kombiniert werden, von denen einige Kontext-/Hintergrundlinien sind.

{
"metrics": [
{"id": "price", "show_in_legend": true},
{"id": "sma_200", "show_in_legend": false}
]
}
FeldTypStandardBeschreibung
show_in_legendbooleantrueOb die Metrik in der Chartlegende erscheint

Intelligente Standardwerte

Die Snapshot-API verwendet intelligente Standardwerte, sodass Sie mit minimaler Konfiguration ansprechende Charts erhalten:

ParameterWie der Standard bestimmt wird
ChartstilAus der Metrik-Registry (chart_types[0])
FarbeAus der Metrik-Registry, dann Palettenrotation
Y-Achsen-SeiteErste Metrik links; Metriken gleichen Formats teilen sich eine Achse; abweichendes Format rechts
Y-Achsen-Skalalinear (mit scale=log überschreiben)
ZeitbereichKategorienbasiert: 365 Tage für Price/Valuation/Profit, 730 für Supply, 180 für Blockchain
TitelEinzelne Metrik: Metrikname. Mehrere: „Name1 vs Name2“
Bildgröße1200 x 600 Pixel
Themelight

Fehlerantworten

Alle Fehler werden als JSON zurückgegeben:

// 400 Bad Request
{"success": false, "error": "invalid_params", "message": "Exactly one of 'metric', 'metrics', or 'template' must be provided"}

// 401 Unauthorized
{"success": false, "error": "unauthorized", "message": "API key required"}

// 403 Forbidden
{"success": false, "error": "insufficient_tier", "message": "Metric 'lth_sopr' requires Pro tier", "upgrade_url": "https://blocklens.co/pricing"}

// 429 Rate Limited
{"success": false, "error": "rate_limited", "message": "Snapshot rate limit exceeded. Max 60 per hour for pro tier.", "retry_after": 120}

// 504 Timeout
{"success": false, "error": "render_timeout", "message": "Chart rendering timed out after 20.0s. Try a shorter date range."}

MCP-Tool: render_chart

Der Blocklens MCP-Server enthält ein render_chart-Tool, mit dem KI-Agenten Chartbilder direkt in Konversationen erzeugen können. Das Tool ruft die Snapshot-API auf und gibt das Bild inline entweder als PNG (Raster) oder SVG (Vektor) zurück.

Parameter

ParameterTypStandardBeschreibung
metricstring-Einzelne Metrik-ID
metricsarray-Mehrere Metriken (Strings oder Objekte)
templatestring-Vorlagen-ID
daysinteger365Tage Historie
start_datestring-Startdatum (YYYY-MM-DD)
end_datestring-Enddatum (YYYY-MM-DD)
overlayprice-Preis-Overlay hinzufügen (derzeit BTC)
themelight / darklightFarbschema
widthinteger1200Bildbreite
heightinteger600Bildhöhe
titlestringautoCharttitel
styleline / area / barautoChartstil
scalelinear / loglinearY-Achsen-Skala
formatpng / svg / jsonpngAusgabeformat: png (Rasterbild), svg (Vektorbild, skaliert ohne Qualitätsverlust) oder json (nur Metadaten — kein Rendering)
y_axesarray-Benutzerdefinierte Y-Achsen mit Zonen (siehe Benutzerdefinierte Y-Achsen)
x_axisdate / day_offsetdateX-Achsen-Modus. Verwenden Sie day_offset für Zyklus-Performance-Overlays — alle metrics müssen aus derselben Zyklusfamilie stammen.
heatmap_idcost-basis-distribution-Eine Heatmap statt eines Liniencharts rendern (siehe Heatmap-Rendering). Schließt sich mit metric / metrics / template gegenseitig aus.
heatmap_period3m / 6m / 1y / 2y / 3y / 5y / all1yHeatmap-Binning-Fenster.
heatmap_color_scaleviridis / plasma / inferno / magma / cividisviridisHeatmap-Farbpalette.
heatmap_y_scalelinear / loglinearY-Achsen-Skala der Heatmap-Preis-Bins.
paramsobject-Parameter pro Aufruf für parametrisierte Metriken (z. B. { "exchange": "binance" }, { "ticker": "IBIT" }, { "entity": "tesla" }).
reference_linesarray-Horizontale Referenzlinien (siehe Referenzlinien & -bereiche)
reference_areasarray-Schattierte Referenzzonen (siehe Referenzlinien & -bereiche)

Verwendungsbeispiele

User: "Show me the MVRV ratio for the last 2 years"
Agent calls: render_chart({ template: "mvrv_ratio", days: 730 })
-> Returns PNG image inline

User: "Chart BTC price vs LTH supply"
Agent calls: render_chart({
metrics: [
{ id: "price", axis: "right" },
{ id: "lth_supply", axis: "left", style: "area" }
],
days: 365
})
-> Returns PNG image inline

User: "Is there capitulation? Show SOPR"
Agent calls: render_chart({ template: "sopr", days: 180, overlay: "price" })
-> Returns PNG image inline

User: "Render the MVRV chart as SVG so I can embed it in a slide deck"
Agent calls: render_chart({ template: "mvrv_ratio", format: "svg" })
-> Returns the chart inline as image/svg+xml and a /chart/renders/{id}.svg URL

MCP-Konfiguration

Fügen Sie dies zu Ihrer Claude-Desktop- oder Cursor-Konfiguration hinzu, um das Chart-Rendering zu aktivieren:

{
"mcpServers": {
"blocklens": {
"command": "npx",
"args": ["-y", "blocklens-mcp-server"],
"env": {
"BLOCKLENS_API_KEY": "your_api_key_here"
}
}
}
}

Siehe MCP Server für vollständige Einrichtungsanweisungen.


Fortgeschrittenes Beispiel: LTH-Supply-Chart

Dieses Beispiel repliziert den vollständigen Chart Long-Term Holder Supply aus dem Blocklens-Dashboard — zwei Metriken, zwei berechnete Formelreihen und drei Y-Achsen:

curl -X POST "https://api.blocklens.co/v1/chart/snapshot" \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"metrics": [
{"id": "price", "label": "BTC Price", "style": "line", "color": "#6b7280", "axis": "right", "fill_opacity": 0, "stroke_width": 1},
{"id": "lth_supply", "label": "LTH Supply", "style": "line", "color": "#2563eb", "axis": "left", "stroke_width": 2}
],
"y_axes": [
{"id": "axis-left", "side": "left", "scale": "linear"},
{"id": "axis-right", "side": "right", "scale": "log"},
{"id": "axis-diff", "side": "left", "scale": "linear"}
],
"formulas": [
{"expression": "max(lth_supply - shift(lth_supply, 30), 0)", "label": "LTH 30d+ diff", "color": "#16a34a", "style": "bar", "y_axis_id": "axis-diff", "fill_opacity": 0.2, "stroke_width": 0},
{"expression": "min(0, lth_supply - shift(lth_supply, 30))", "label": "LTH 30d- diff", "color": "#dc2626", "style": "bar", "y_axis_id": "axis-diff", "fill_opacity": 0.2, "stroke_width": 0}
],
"days": 730,
"title": "Long-Term Holder Supply"
}' --output lth_supply.png

Was dies erzeugt:

  • BTC Price — graue Linie auf der rechten Achse (Log-Skala)
  • LTH Supply — blaue Linie auf der linken Achse (linear)
  • 30-tägige positive Akkumulation — halbtransparente grüne Balken auf einer separaten axis-diff-Achse
  • 30-tägige Distribution — halbtransparente rote Balken auf derselben axis-diff-Achse

Verwendete Schlüsseltechniken:

  • shift(lth_supply, 30) berechnet den 30-Tage-Rückblickwert
  • max(..., 0) und min(0, ...) teilen positive und negative Veränderungen in separate Reihen auf
  • y_axis_id: "axis-diff" bindet beide Formelbalken an eine dedizierte Achse, unabhängig von den Hauptmetrikachsen
  • fill_opacity: 0.2 + stroke_width: 0 erzeugt dezente, randlose transparente Balken

Chart-Vorlagen

Vollständige Chartkonfigurationen (einschließlich Metriken, Formeln, Achsen und Styling) sind als datenbankgestützte Vorlagen verfügbar über:

GET /api/lab/templates

Diese Vorlagen können als Referenz dienen, um Ihre eigenen POST-Request-Bodies zu erstellen. Jede Vorlage enthält die vollständige Konfiguration, die einen bestimmten Chart auf dem Blocklens-Dashboard erzeugt.


Wasserzeichen

Alle gerenderten Chartbilder enthalten ein blocklens.co-Wasserzeichen und einen Copyright-Hinweis. Dies gilt sowohl für PNG- als auch für SVG-Ausgabeformate.


Caching

Gerenderte Snapshots werden für 1 Stunde in Redis gecacht. Cache-Verhalten:

  • Identische Chartkonfigurationen liefern gecachte Ergebnisse sofort zurück
  • Der Cache-Schlüssel wird aus der vollständigen Chartkonfiguration (Metriken, Achsen, Zeitbereich, Theme, Größe) plus dem Ausgabeformat abgeleitet — PNG- und SVG-Varianten desselben Charts werden unabhängig voneinander gecacht
  • Der Response-Header X-Snapshot-Cache zeigt HIT oder MISS an
  • Der Header X-Snapshot-Render-Ms zeigt die Renderzeit (0 bei Cache-Treffern)
  • Gerenderte Dateien werden außerdem für 1 Stunde auf der Festplatte unter /v1/chart/renders/{render_id}.png und /v1/chart/renders/{render_id}.svg gespeichert, sodass die im X-Render-Id-Header zurückgegebenen Chart-URLs erreichbar bleiben
  • Beliebte Charts werden nach jedem täglichen Datenupdate (05:00 UTC) vorgewärmt