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
| Methode | Pfad | Beschreibung |
|---|---|---|
GET | /v1/chart/snapshot | Einfache Charts über Query-Parameter |
POST | /v1/chart/snapshot | Vollstä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:
| Ausgabe | Gecacht unter |
|---|---|
| PNG | https://api.blocklens.co/v1/chart/renders/{X-Render-Id}.png |
| SVG | https://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
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
metric | string | - | Einzelne Metrik-ID (z. B. price, lth_supply). Schließt sich mit metrics und template gegenseitig aus. |
metrics | string | - | Kommagetrennte Metrik-IDs, maximal 6 (z. B. lth_supply,sth_supply). Schließt sich mit metric und template gegenseitig aus. |
template | string | - | Vordefinierte Vorlagen-ID. Schließt sich mit metric und metrics gegenseitig aus. |
days | integer | 365 | Tage historischer Daten (7–10000). |
start_date | string | - | Startdatum (YYYY-MM-DD). Überschreibt days. |
end_date | string | - | Enddatum (YYYY-MM-DD). Standardmäßig heute. |
style | string | auto | Chartstil: line, area, bar. Wird automatisch aus der Metrik-Registry erkannt, wenn weggelassen. |
scale | string | linear | Y-Achsen-Skala: linear oder log. |
overlay | string | - | Fügt ein Preis-Overlay als dezente gestrichelte Linie auf der rechten Achse hinzu (Wert price verwenden). Derzeit BTC-Preis. |
width | integer | 1200 | Bildbreite in Pixeln (600–2400). |
height | integer | 600 | Bildhöhe in Pixeln (300–1200). |
title | string | auto | Charttitel. Wird automatisch aus den Metriknamen erzeugt, wenn weggelassen. |
theme | string | light | Farbschema: light oder dark. |
Genau eines von metric, metrics oder template muss angegeben werden.
Verfügbare Vorlagen
| Vorlage | Metriken |
|---|---|
price | BTC-Preis |
price_volume | Preis + Volumen |
market_cap | Market Cap |
holder_supply | LTH Supply + STH Supply |
mvrv_ratio | LTH MVRV + STH MVRV |
realized_price | LTH Realized Price + STH Realized Price |
realized_cap | LTH Realized Cap + STH Realized Cap |
unrealized_pl | LTH Unrealized P/L + STH Unrealized P/L |
realized_pl | LTH Realized P/L + STH Realized P/L |
sopr | LTH SOPR + STH SOPR |
block_height | Block 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
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Erforderlich. Metrik-ID aus der Registry. |
params | object | Parameter für parametrisierte Metriken (z. B. {"exchange": "binance"}). Erforderliche Parameter siehe Metrikdefinition. |
axis | left / right | Seite der Y-Achse. Wird automatisch zugewiesen, wenn weggelassen. |
y_axis_id | string | Bindung an eine bestimmte Y-Achse per ID (z. B. axis-diff). Überschreibt axis. |
style | line / area / bar | Chartstil. Registry-Standard, wenn weggelassen. |
color | string | Hex-Farbe (z. B. #2563eb). Wird automatisch zugewiesen, wenn weggelassen. |
label | string | Anzeigebezeichnung. Verwendet den Metriknamen, wenn weggelassen. |
stroke_width | integer | Linienbreite (0–5). Standard: 2. 0 für Balken ohne Rand verwenden. |
fill_opacity | float | Fülldeckkraft (0.0–1.0). Für transparente Balken niedrige Werte wie 0.2 verwenden. |
stroke_dash | string | Strichmuster (z. B. 5 5). |
stack_group | string | Stack-Gruppen-ID für gestapelte Charts. |
show_in_legend | boolean | Ob die Metrik in der Chartlegende angezeigt wird. Standard: true. |
visible | boolean | Ein-/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"}
]
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Eindeutige Achsenkennung. Referenziert per y_axis_id auf Metriken/Formeln. |
side | left / right | Auf welcher Seite des Charts die Achse erscheint. |
scale | linear / log | Achsenskala. Standard: linear. |
format | number / currency / percent | Zahlenformat 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_min | number | Harte Untergrenze der Domain. Die Achse geht nie unter diesen Wert. |
domain_max | number | Harte 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: 0die 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
| Funktion | Syntax | Beschreibung |
|---|---|---|
sma | sma(series, period) | Einfacher gleitender Durchschnitt (SMA) |
ema | ema(series, period) | Exponentieller gleitender Durchschnitt (EMA) |
median | median(series, period) | Rollierender Median |
sum | sum(series, period) | Rollierende Summe |
std | std(series, period) | Rollierende Standardabweichung |
Kumulativ
| Funktion | Syntax | Beschreibung |
|---|---|---|
cumsum | cumsum(series) | Expandierende kumulative Summe |
cummean | cummean(series) | Expandierender kumulativer Mittelwert |
cummedian | cummedian(series) | Expandierender kumulativer Median |
cumstd | cumstd(series) | Expandierende kumulative Standardabweichung |
cummax | cummax(series) | Kumulatives Allzeitmaximum |
cummin | cummin(series) | Kumulatives Allzeitminimum |
Veränderungen
| Funktion | Syntax | Beschreibung |
|---|---|---|
percent_change | percent_change(series, period) | Prozentuale Veränderung (Dezimal: 0.20 = +20 %) |
diff | diff(series, period) | Absolute Wertveränderung |
Mathematik
| Funktion | Syntax | Beschreibung |
|---|---|---|
abs | abs(series) | Absolutwert |
pow | pow(series, n) | Potenzierung mit n |
log | log(series) | Logarithmus zur Basis 10 |
round | round(series, digits) | Auf N Nachkommastellen runden |
max | max(a, b, ...) | Punktweises Maximum |
min | min(a, b, ...) | Punktweises Minimum |
Technische Indikatoren
| Funktion | Syntax | Beschreibung |
|---|---|---|
rsi | rsi(series, period) | Relative Strength Index (0–100) |
corr | corr(s1, s2, period) | Pearson-Korrelation (−1 bis 1) |
drawdown | drawdown(series) | Drawdown vom ATH (negativer Dezimalwert) |
Risiko & Rendite
| Funktion | Syntax | Beschreibung |
|---|---|---|
mean_return | mean_return(series, period) | Annualisierte rollierende Durchschnittsrendite |
realized_vol | realized_vol(series, period) | Annualisierte realisierte Volatilität |
sharpe_ratio_arithmetic | sharpe_ratio_arithmetic(series, period) | Sharpe Ratio (arithmetisch) |
sharpe_ratio_geometric | sharpe_ratio_geometric(series, period) | Sharpe Ratio (geometrisch) |
Reihenmanipulation
| Funktion | Syntax | Beschreibung |
|---|---|---|
shift | shift(series, period) | Reihe um N Perioden verschieben |
if | if(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:
| Feld | Typ | Beschreibung |
|---|---|---|
expression | string | Erforderlich. Formelausdruck mit Metrik-IDs oder Positionsreferenzen (m1, m2). |
label | string | Erforderlich. Anzeigebezeichnung für die Legende. |
color | string | Hex-Farbe. Wird automatisch zugewiesen, wenn weggelassen. |
style | line / area / bar | Chartstil. Standard: line. |
y_axis_id | string | Bindung an eine bestimmte Y-Achse per ID (z. B. axis-diff). Überschreibt axis. |
axis | left / right | Seite der Y-Achse. Standard: left. Ignoriert, wenn y_axis_id gesetzt ist. |
fill_opacity | float | Fülldeckkraft (0.0–1.0). Für transparente Balken niedrige Werte wie 0.2 verwenden. |
stroke_width | integer | Linienbreite (0–5). 0 für Balken ohne Rand verwenden. |
stroke_dash | string | Strichmuster (z. B. 6 3). |
stack_group | string | Stack-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
| Feld | Typ | Beschreibung |
|---|---|---|
y | number | Statischer Y-Wert. |
y_formula | string | Formelausdruck für dynamisches Y (z. B. "sma(m1, 200)"). Verwendet dieselbe Engine wie formulas. |
y_axis_id | string | Y-Achsen-ID (Standard: erste linke Achse). |
stroke | string | Linienfarbe in Hex (Standard: #9ca3af). |
stroke_dasharray | string | Strichmuster, z. B. "3 3" für gestrichelt. |
label | string | Beschriftungstext. |
Geben Sie entweder y (statisch) oder y_formula (dynamisch) an, nicht beides. Maximal 10 Referenzlinien pro Chart.
Optionen für Referenzbereiche
| Feld | Typ | Beschreibung |
|---|---|---|
y1 | number | Statische untere Y-Grenze. |
y2 | number | Statische obere Y-Grenze. |
y1_formula | string | Formel für die dynamische untere Grenze. |
y2_formula | string | Formel für die dynamische obere Grenze. |
y_axis_id | string | Y-Achsen-ID (Standard: erste linke Achse). |
fill | string | Füllfarbe in Hex (Standard: #3b82f6). |
fill_opacity | number | Fülldeckkraft 0–1 (Standard: 0.1). |
label | string | Beschriftungstext. |
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:
| Format | Content-Type | Beschreibung |
|---|---|---|
png (Standard) | image/png | Gerastertes Chartbild |
svg | image/svg+xml | Vektorgrafik (skalierbar, einbettbar) |
json | application/json | Chart-Metadaten (kein Rendering) |
Alternativ können Sie den Accept-Header verwenden:
Accept: image/png- PNG (Standard)Accept: image/svg+xml- SVGAccept: 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
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
heatmap_id | string | - | Heatmap-Kennung (z. B. cost-basis-distribution) |
heatmap_period | string | 1y | Zeitraum: 3m, 6m, 1y, 2y, 3y, 5y, all |
heatmap_color_scale | string | viridis | Farbskala: viridis, plasma, inferno, magma, cividis |
heatmap_y_scale | string | linear | Y-Achsen-Skala: linear oder log |
theme | string | light | Farbschema: light oder dark |
title | string | auto | Charttitel |
width | integer | 1200 | Bildbreite in Pixeln |
height | integer | 600 | Bildhö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_1…cycle_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:
| Anker | Metrik-ID-Präfix | Beschreibung | Endpunkt-Hinweis |
|---|---|---|---|
| Zyklustief → nächstes Tief | cycle_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 → ATH | cycle_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 → Halving | cycle_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-ID | Ankerdatum | Anker → Enddatum |
|---|---|---|
cycle_low_1 | 2011-11-18 | 2011-11-18 → 2015-01-14 |
cycle_low_2 | 2015-01-14 | 2015-01-14 → 2018-12-15 |
cycle_low_3 | 2018-12-15 | 2018-12-15 → 2022-11-21 |
cycle_low_4 | 2022-11-21 | 2022-11-21 → heute (aktueller Zyklus) |
cycle_ath_1 | 2011-06-11 | 2011-06-11 → 2013-11-30 |
cycle_ath_2 | 2013-11-30 | 2013-11-30 → 2017-12-17 |
cycle_ath_3 | 2017-12-17 | 2017-12-17 → 2021-11-10 |
cycle_ath_4 | 2021-11-10 | 2021-11-10 → 2025-10-06 |
cycle_ath_5 | 2025-10-06 | 2025-10-06 → heute (aktueller Zyklus) |
cycle_halving_1 | 2012-11-28 | 2012-11-28 → 2016-07-09 |
cycle_halving_2 | 2016-07-09 | 2016-07-09 → 2020-05-11 |
cycle_halving_3 | 2020-05-11 | 2020-05-11 → 2024-04-20 |
cycle_halving_4 | 2024-04-20 | 2024-04-20 → heute (aktueller Zyklus) |
- Alle
metricsmüssen aus derselben Ankerfamilie stammen. Das Mischen voncycle_ath_*mitcycle_low_*(oder allem außerhalb vondaily_cycle_performance) liefert400 invalid_params. - Das Flag
x_axis: "day_offset"ist nur für Zyklusmetriken gültig — eine Kombination mit einer anderen Metrik liefert400 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:
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
x_axis | "date" / "day_offset" | "date" | Auf "day_offset" setzen, um das Zyklus-Overlay zu aktivieren. Andernfalls ist die X-Achse kalenderdatumsbasiert. |
metrics | array | erforderlich | 1–6 Zyklusmetrik-IDs aus derselben Ankerfamilie. Strings oder Objekte ({id, color, style, label, stroke_width, fill_opacity, show_in_legend, y_axis_id}). |
days | integer | 365 | Begrenzt 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}
]
}
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
show_in_legend | boolean | true | Ob die Metrik in der Chartlegende erscheint |
Intelligente Standardwerte
Die Snapshot-API verwendet intelligente Standardwerte, sodass Sie mit minimaler Konfiguration ansprechende Charts erhalten:
| Parameter | Wie der Standard bestimmt wird |
|---|---|
| Chartstil | Aus der Metrik-Registry (chart_types[0]) |
| Farbe | Aus der Metrik-Registry, dann Palettenrotation |
| Y-Achsen-Seite | Erste Metrik links; Metriken gleichen Formats teilen sich eine Achse; abweichendes Format rechts |
| Y-Achsen-Skala | linear (mit scale=log überschreiben) |
| Zeitbereich | Kategorienbasiert: 365 Tage für Price/Valuation/Profit, 730 für Supply, 180 für Blockchain |
| Titel | Einzelne Metrik: Metrikname. Mehrere: „Name1 vs Name2“ |
| Bildgröße | 1200 x 600 Pixel |
| Theme | light |
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
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
metric | string | - | Einzelne Metrik-ID |
metrics | array | - | Mehrere Metriken (Strings oder Objekte) |
template | string | - | Vorlagen-ID |
days | integer | 365 | Tage Historie |
start_date | string | - | Startdatum (YYYY-MM-DD) |
end_date | string | - | Enddatum (YYYY-MM-DD) |
overlay | price | - | Preis-Overlay hinzufügen (derzeit BTC) |
theme | light / dark | light | Farbschema |
width | integer | 1200 | Bildbreite |
height | integer | 600 | Bildhöhe |
title | string | auto | Charttitel |
style | line / area / bar | auto | Chartstil |
scale | linear / log | linear | Y-Achsen-Skala |
format | png / svg / json | png | Ausgabeformat: png (Rasterbild), svg (Vektorbild, skaliert ohne Qualitätsverlust) oder json (nur Metadaten — kein Rendering) |
y_axes | array | - | Benutzerdefinierte Y-Achsen mit Zonen (siehe Benutzerdefinierte Y-Achsen) |
x_axis | date / day_offset | date | X-Achsen-Modus. Verwenden Sie day_offset für Zyklus-Performance-Overlays — alle metrics müssen aus derselben Zyklusfamilie stammen. |
heatmap_id | cost-basis-distribution | - | Eine Heatmap statt eines Liniencharts rendern (siehe Heatmap-Rendering). Schließt sich mit metric / metrics / template gegenseitig aus. |
heatmap_period | 3m / 6m / 1y / 2y / 3y / 5y / all | 1y | Heatmap-Binning-Fenster. |
heatmap_color_scale | viridis / plasma / inferno / magma / cividis | viridis | Heatmap-Farbpalette. |
heatmap_y_scale | linear / log | linear | Y-Achsen-Skala der Heatmap-Preis-Bins. |
params | object | - | Parameter pro Aufruf für parametrisierte Metriken (z. B. { "exchange": "binance" }, { "ticker": "IBIT" }, { "entity": "tesla" }). |
reference_lines | array | - | Horizontale Referenzlinien (siehe Referenzlinien & -bereiche) |
reference_areas | array | - | 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ückblickwertmax(..., 0)undmin(0, ...)teilen positive und negative Veränderungen in separate Reihen aufy_axis_id: "axis-diff"bindet beide Formelbalken an eine dedizierte Achse, unabhängig von den Hauptmetrikachsenfill_opacity: 0.2+stroke_width: 0erzeugt 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-CachezeigtHIToderMISSan - Der Header
X-Snapshot-Render-Mszeigt die Renderzeit (0 bei Cache-Treffern) - Gerenderte Dateien werden außerdem für 1 Stunde auf der Festplatte unter
/v1/chart/renders/{render_id}.pngund/v1/chart/renders/{render_id}.svggespeichert, sodass die imX-Render-Id-Header zurückgegebenen Chart-URLs erreichbar bleiben - Beliebte Charts werden nach jedem täglichen Datenupdate (05:00 UTC) vorgewärmt