Перейти к основному содержимому

Snapshot API

Snapshot API отрисовывает графики on-chain аналитики в виде PNG-изображений или векторной графики SVG. Передайте идентификаторы метрик и необязательные параметры отображения — и получите полностью отрисованное изображение графика, готовое для встраивания в отчёты, дашборды или диалоги с ИИ. На данный момент поддерживаются метрики Bitcoin, при этом мультичейн-покрытие (ETH, TON, TRON) расширяется.

Эндпоинты

МетодПутьОписание
GET/v1/chart/snapshotПростые графики через query-параметры
POST/v1/chart/snapshotПолная настройка через JSON-тело

Оба эндпоинта по умолчанию возвращают image/png. Переключиться на SVG (image/svg+xml) или JSON-метаданные (application/json) можно, задав заголовок запроса Accept или — для POST — поле format в теле ("png", "svg", "json").

Успешные ответы в формате PNG и SVG содержат заголовок X-Render-Id, чтобы отрисованный график можно было повторно получить по URL в течение 1 часа:

ВыводКэшируется по адресу
PNGhttps://api.blocklens.co/v1/chart/renders/{X-Render-Id}.png
SVGhttps://api.blocklens.co/v1/chart/renders/{X-Render-Id}.svg

Аутентификация

Все запросы требуют API-ключ, передаваемый в заголовке Authorization:

Authorization: Bearer YOUR_API_KEY

Подробнее о получении API-ключей см. в разделе Аутентификация.

Доступ и лимиты запросов

Snapshot API требует тарифа Pro или Enterprise. Ключи тарифов Demo и Free получают 403 Forbidden.

Snapshot API подчиняется тем же лимитам запросов, что и Data API. Подробнее см. в разделе Лимиты запросов.

При превышении лимита API возвращает 429 Too Many Requests с полем retry_after.

Доступ к метрикам также ограничивается по грейдам: метрики грейда 0 (price, supply, MVRV) доступны всем ключам Pro и выше, метрики грейда 1 (SOPR, P&L) требуют тарифа Pro, а метрики грейда 2 (тепловые карты CBD) требуют тарифа Enterprise.


GET /v1/chart/snapshot

Генерация графика по query-параметрам. Лучше всего подходит для простых графиков с одной метрикой или на основе шаблона.

Параметры

ПараметрТипПо умолчаниюОписание
metricstring-Идентификатор одной метрики (например, price, lth_supply). Взаимоисключающий с metrics и template.
metricsstring-Идентификаторы метрик через запятую, максимум 6 (например, lth_supply,sth_supply). Взаимоисключающий с metric и template.
templatestring-Идентификатор предопределённого шаблона. Взаимоисключающий с metric и metrics.
daysinteger365Количество дней исторических данных (7–10000).
start_datestring-Начальная дата (YYYY-MM-DD). Переопределяет days.
end_datestring-Конечная дата (YYYY-MM-DD). По умолчанию — сегодня.
stylestringautoСтиль графика: line, area, bar. Определяется автоматически по реестру метрик, если не указан.
scalestringlinearШкала оси Y: linear или log.
overlaystring-Добавляет наложение цены в виде неброской пунктирной линии на правой оси (используйте price). На данный момент — цена BTC.
widthinteger1200Ширина изображения в пикселях (600–2400).
heightinteger600Высота изображения в пикселях (300–1200).
titlestringautoЗаголовок графика. Генерируется автоматически по названиям метрик, если не указан.
themestringlightЦветовая тема: light или dark.

Должен быть указан ровно один из параметров: metric, metrics или template.

Доступные шаблоны

ШаблонМетрики
priceBTC Price
price_volumePrice + Volume
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

Примеры

# 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

Успешный ответ

PNG (по умолчанию):

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 (с 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>

Значение X-Render-Id можно использовать для повторного получения того же изображения по адресу /v1/chart/renders/{render_id}.png или /v1/chart/renders/{render_id}.svg в течение 1 часа.


POST /v1/chart/snapshot

Полная настройка графика через JSON-тело. Поддерживает индивидуальное оформление каждой метрики, пользовательские оси, формулы, опорные линии, опорные области и многое другое. Предназначен для ИИ-агентов (через MCP) и продвинутых пользователей.

Тело запроса

Укажите ровно один источник данных (metric, metrics или 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"}
]
}

Примечание: должен быть указан ровно один из параметров metric, metrics или template.

Поле metrics

Поле metrics поддерживает смешанные типы:

// 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"}
]

Некоторые метрики требуют дополнительных параметров (например, exchange, ticker, id). При использовании таких метрик включайте объект params из определения метрики.

Опции для отдельных метрик

ПолеТипОписание
idstringОбязательное. Идентификатор метрики из реестра.
paramsobjectПараметры для параметризованных метрик (например, {"exchange": "binance"}). См. определение метрики для списка обязательных параметров.
axisleft / rightСторона оси Y. Назначается автоматически, если не указано.
y_axis_idstringПривязка к конкретной оси Y по идентификатору (например, axis-diff). Переопределяет axis.
styleline / area / barСтиль графика. Значение по умолчанию из реестра, если не указано.
colorstringЦвет в hex (например, #2563eb). Назначается автоматически, если не указан.
labelstringОтображаемая подпись. Используется название метрики, если не указано.
stroke_widthintegerТолщина линии (0–5). По умолчанию: 2. Используйте 0 для столбцов без границ.
fill_opacityfloatНепрозрачность заливки (0.0–1.0). Для прозрачных столбцов используйте небольшие значения, например 0.2.
stroke_dashstringШаблон пунктира (например, 5 5).
stack_groupstringИдентификатор группы стека для столбчатых диаграмм с накоплением.
show_in_legendbooleanПоказывать ли метрику в легенде графика. По умолчанию: true.
visiblebooleanПоказать/скрыть. По умолчанию: true.

Пользовательские оси Y

Поле y_axes задаёт оси Y, доступные метрикам и формулам. Каждая ось имеет уникальный id, на который можно сослаться через y_axis_id у метрик или формул. Можно определить более двух осей — например, отдельную ось для вычисленных разностей:

"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"}
]
ПолеТипОписание
idstringУникальный идентификатор оси. На него ссылаются через y_axis_id у метрик/формул.
sideleft / rightНа какой стороне графика отображается ось.
scalelinear / logШкала оси. По умолчанию: linear.
formatnumber / currency / percentЧисловой формат подписей оси.
range[number, number]Вертикальная зона как [from%, to%]. 0 = низ, 100 = верх. По умолчанию: вся высота. Используйте, чтобы разнести оси по вертикали друг над другом (например, объём в нижних 20%, цена в верхних 80%).
domain_minnumberЖёсткое ограничение минимума домена. Ось никогда не опустится ниже этого значения.
domain_maxnumberЖёсткое ограничение максимума домена. Ось никогда не поднимется выше этого значения.
no_padding"top" / "bottom" / "both"Убрать автоматический 10%-й отступ от краёв. Полезно, когда ограничение домена является жёсткой границей (например, просадка ограничена нулём).

Если y_axes не указано, оси генерируются автоматически на основе значений axis у метрик.

Пример: цена + объём с вертикальными зонами

Разместить столбцы объёма в нижних 20%, а цену — в оставшемся пространстве:

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

Что это даёт:

  • Столбцы объёма заполняют нижние 20% графика (range: [0, 20]) без отступа у нижнего края
  • Цена занимает верхние 80% (range: [20, 100]) на логарифмической шкале
  • Два ряда никогда не пересекаются, образуя аккуратную ярусную компоновку

Пример: просадка с ограничением домена

Ограничить просадку нулём (верхний край), чтобы линия касалась верха своей зоны:

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

Что это даёт:

  • Просадка всегда ≤ 0, поэтому domain_max: 0 ограничивает верхний край
  • no_padding: "top" убирает автоматический 10%-й отступ над 0, заставляя линию касаться верха, когда просадка равна 0%
  • Цена находится на правой оси с логарифмической шкалой

Формулы

Поле formulas позволяет задавать вычисляемые ряды, производные от ваших метрик. Формулы могут ссылаться на метрики по их id (например, lth_supply) или по позиционному индексу (m1, m2 и т. д., в порядке расположения в массиве metrics).

"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
}
]

Поддерживаемые функции (всего 30):

Скользящие средние и скользящая статистика

ФункцияСинтаксисОписание
smasma(series, period)Простое скользящее среднее
emaema(series, period)Экспоненциальное скользящее среднее
medianmedian(series, period)Скользящая медиана
sumsum(series, period)Скользящая сумма
stdstd(series, period)Скользящее стандартное отклонение

Накопительные

ФункцияСинтаксисОписание
cumsumcumsum(series)Нарастающая накопительная сумма
cummeancummean(series)Нарастающее накопительное среднее
cummediancummedian(series)Нарастающая накопительная медиана
cumstdcumstd(series)Нарастающее накопительное стандартное отклонение
cummaxcummax(series)Накопительный максимум за всё время
cummincummin(series)Накопительный минимум за всё время

Изменения

ФункцияСинтаксисОписание
percent_changepercent_change(series, period)Процентное изменение (в долях: 0.20 = +20%)
diffdiff(series, period)Изменение абсолютного значения

Математика

ФункцияСинтаксисОписание
absabs(series)Абсолютное значение
powpow(series, n)Возведение в степень n
loglog(series)Логарифм по основанию 10
roundround(series, digits)Округление до N знаков после запятой
maxmax(a, b, ...)Поточечный максимум
minmin(a, b, ...)Поточечный минимум

Технические индикаторы

ФункцияСинтаксисОписание
rsirsi(series, period)Индекс относительной силы (0–100)
corrcorr(s1, s2, period)Корреляция Пирсона (от -1 до 1)
drawdowndrawdown(series)Просадка от ATH (отрицательная доля)

Риск и доходность

ФункцияСинтаксисОписание
mean_returnmean_return(series, period)Годовая скользящая средняя доходность
realized_volrealized_vol(series, period)Годовая реализованная волатильность
sharpe_ratio_arithmeticsharpe_ratio_arithmetic(series, period)Коэффициент Шарпа (арифметический)
sharpe_ratio_geometricsharpe_ratio_geometric(series, period)Коэффициент Шарпа (геометрический)

Манипуляции с рядами

ФункцияСинтаксисОписание
shiftshift(series, period)Сдвиг ряда на N периодов
ifif(a, "op", b, then, else)Условие (op: =, !=, >, >=, <, <=)

Операторы

Арифметические: +, -, *, / Группировка: (, )

Ссылки

  • Метрики по имени: lth_supply + sth_supply — используйте идентификаторы метрик напрямую
  • Метрики по позиции: m1 + m2 — позиционные ссылки (m1 = первая метрика, m2 = вторая и т. д.)
  • Другие формулы: f1 * 2 — ссылка на более ранние формулы (f1 = первая формула и т. д.)
  • Формулы вычисляются по порядку, поэтому f2 может ссылаться на f1, но не наоборот.

Опции формул:

ПолеТипОписание
expressionstringОбязательное. Выражение формулы с использованием идентификаторов метрик или позиционных ссылок (m1, m2).
labelstringОбязательное. Отображаемая подпись для легенды.
colorstringЦвет в hex. Назначается автоматически, если не указан.
styleline / area / barСтиль графика. По умолчанию: line.
y_axis_idstringПривязка к конкретной оси Y по идентификатору (например, axis-diff). Переопределяет axis.
axisleft / rightСторона оси Y. По умолчанию: left. Игнорируется, если задан y_axis_id.
fill_opacityfloatНепрозрачность заливки (0.0–1.0). Для прозрачных столбцов используйте небольшие значения, например 0.2.
stroke_widthintegerТолщина обводки (0–5). Используйте 0 для столбцов без границ.
stroke_dashstringШаблон пунктира (например, 6 3).
stack_groupstringИдентификатор группы стека для накопления нескольких рядов формул.

Опорные линии и области

Опорные линии добавляют горизонтальные направляющие линии для выделения конкретных значений (например, точки безубыточности на уровне 1.0, порога перекупленности). Опорные области добавляют затенённые зоны для выделения диапазонов значений (например, зоны недооценённости, полос по типу Боллинджера). Обе поддерживают статические значения и динамические формулы, используя тот же движок формул, что и поле formulas.

Опции опорной линии

ПолеТипОписание
ynumberСтатическое значение Y.
y_formulastringВыражение формулы для динамического Y (например, "sma(m1, 200)"). Использует тот же движок, что и formulas.
y_axis_idstringИдентификатор оси Y (по умолчанию — первая левая ось).
strokestringЦвет линии в hex (по умолчанию: #9ca3af).
stroke_dasharraystringШаблон пунктира, например "3 3" для пунктирной линии.
labelstringТекст подписи.

Укажите либо y (статическое), либо y_formula (динамическое), но не оба. Максимум 10 опорных линий на график.

Опции опорной области

ПолеТипОписание
y1numberСтатическая нижняя граница Y.
y2numberСтатическая верхняя граница Y.
y1_formulastringФормула для динамической нижней границы.
y2_formulastringФормула для динамической верхней границы.
y_axis_idstringИдентификатор оси Y (по умолчанию — первая левая ось).
fillstringЦвет заливки в hex (по умолчанию: #3b82f6).
fill_opacitynumberНепрозрачность заливки 0–1 (по умолчанию: 0.1).
labelstringТекст подписи.

Укажите статические границы (y1/y2) или границы на основе формул (y1_formula/y2_formula) — их можно смешивать (например, статическое y1 с динамическим y2_formula). Максимум 10 опорных областей на график.

Пример: MVRV с зонами стоимости

Добавить зелёную зону недооценённости (0–0.85), красную зону переоценённости (8–100) и пунктирную линию безубыточности на уровне 1.0:

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

Пример: полоса на основе формулы

Создать полосу по типу Боллинджера вокруг первой формулы (огибающая ±10%):

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

Формат вывода

Поле format управляет выводом:

ФорматContent-TypeОписание
png (по умолчанию)image/pngРастровое изображение графика
svgimage/svg+xmlВекторная графика (масштабируемая, встраиваемая)
jsonapplication/jsonМетаданные графика (без отрисовки)

В качестве альтернативы используйте заголовок Accept:

  • Accept: image/png — PNG (по умолчанию)
  • Accept: image/svg+xml — SVG
  • Accept: application/json — JSON-метаданные

Ответ с JSON-метаданными

При format=json или 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
}

Примеры

# 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

Отрисовка тепловых карт

Snapshot API может отрисовывать тепловые карты для метрик на основе распределений, таких как Cost Basis Distribution. Тепловые карты используют отдельный набор параметров, отличный от стандартных графиков метрик.

Параметры тепловой карты

ПараметрТипПо умолчаниюОписание
heatmap_idstring-Идентификатор тепловой карты (например, cost-basis-distribution)
heatmap_periodstring1yВременной период: 3m, 6m, 1y, 2y, 3y, 5y, all
heatmap_color_scalestringviridisЦветовая шкала: viridis, plasma, inferno, magma, cividis
heatmap_y_scalestringlinearШкала оси Y: linear или log
themestringlightЦветовая тема: light или dark
titlestringautoЗаголовок графика
widthinteger1200Ширина изображения в пикселях
heightinteger600Высота изображения в пикселях

Пример

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

Примечание: параметры тепловой карты (heatmap_id и т. д.) взаимоисключающи со стандартными параметрами метрик (metric, metrics, template). Метрики тепловых карт требуют тарифа Enterprise.

Легенда цветовой шкалы включается в отрисованное изображение, показывая диапазон значений, сопоставленный с выбранной цветовой палитрой.


Графики наложения производительности циклов

Графики производительности циклов накладывают несколько циклов Bitcoin на одну ось X, чтобы их можно было сравнивать на равных. Вместо построения по календарным датам цена каждого цикла индексируется относительно собственного опорного события (минимума цикла, ATH или халвинга) и строится по числу дней с момента этого опорного события.

Включите режим наложения, задав x_axis: "day_offset" в запросе POST /v1/chart/snapshot и передав метрики циклов в массиве metrics. Рендерер использует поле day_offset каждой точки данных вместо date, поэтому все циклы начинаются с Дня 0 на оси X.

Подписи делений показывают календарные даты из последнего цикла выбранного семейства. Например, наложение по ATH (cycle_ath_1cycle_ath_5) привязывается к 2025-10-06, и деления читаются как Oct '25, Jan '26, Apr '26 и т. д., а не Day 0, Day 90, Day 180. Другие циклы на том же графике выровнены по тем же позициям оси X, поэтому значение на делении Apr '26 для cycle_ath_3 означает «что делал BTC на 182-й день цикла 2017 года». Нумерация по дням появляется в качестве запасного варианта только в том случае, если бэкенд не может определить опорную точку.

Типы опорных точек

Доступны три семейства метрик циклов, по одному на каждое опорное событие:

Опорная точкаПрефикс ID метрикиОписаниеПодсказка по эндпоинту
Минимум цикла → следующий минимумcycle_low_*Цена, индексированная относительно дна цикла — каждый ряд начинается с 1.0 на дату минимума и идёт до минимума следующего цикла.endpoint: "cycle-performance?type=low"
ATH → ATHcycle_ath_*Цена, индексированная относительно исторического максимума цикла — каждый ряд начинается с 1.0 на дату ATH и идёт до следующего ATH.endpoint: "cycle-performance?type=ath"
Халвинг → халвингcycle_halving_*Цена, индексированная относительно блока халвинга — каждый ряд начинается с 1.0 на дату халвинга и идёт до следующего халвинга.endpoint: "cycle-performance?type=halving"

В пределах семейства опорных точек каждый цикл представляет собой данные одинаковой формы — индекс, который начинается с 1.0 и отслеживает price(t) / price(anchor) до следующего опорного события (или, для текущего цикла, до сегодняшнего дня). Именно это делает сравнение наложением осмысленным: значение 5.0 на 200-й день cycle_ath_3 означает «BTC был в 5× выше своего ATH 2017 года через 200 дней после этого ATH».

Все доступные метрики циклов

ID метрикиДата опорной точкиОпорная точка → конечная дата
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 → сегодня (текущий цикл)
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 → сегодня (текущий цикл)
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 → сегодня (текущий цикл)
Правила валидации
  • Все metrics должны быть из одного семейства опорных точек. Смешивание cycle_ath_* с cycle_low_* (или чем-либо за пределами daily_cycle_performance) возвращает 400 invalid_params.
  • Флаг x_axis: "day_offset" действителен только для метрик циклов — его сочетание с любой другой метрикой возвращает 400 invalid_params.
  • Действует стандартный лимит «максимум 6 метрик на график» — выбирайте до 6 циклов на наложение.

Параметры производительности циклов

В дополнение ко всем стандартным параметрам графика (days, width, height, theme, scale, format, title, y_axes, reference_lines, reference_areas, formulas и т. д.) режим наложения циклов использует следующие поля:

ПолеТипПо умолчаниюОписание
x_axis"date" / "day_offset""date"Установите "day_offset", чтобы включить наложение циклов. В противном случае ось X — календарная дата.
metricsarrayобязательное1–6 идентификаторов метрик циклов из одного семейства опорных точек. Строки или объекты ({id, color, style, label, stroke_width, fill_opacity, show_in_legend, y_axis_id}).
daysinteger365Ограничивает максимальное смещение дня при отрисовке (диапазон оси X, а не календарные дни). Установите 1500, чтобы видеть ~4 года на цикл.
scale"linear" / "log""linear"Логарифмическая шкала почти всегда — то, что вам нужно: множители ранних циклов могут составлять 100×–500×, что нечитаемо на линейной шкале.
theme"light" / "dark""light"Тёмная тема используется в дашборде по умолчанию для этих графиков.

Опорные линии (reference_lines) особенно полезны на графиках наложения — например, горизонтальная линия на y: 1.0 отмечает уровень опорной точки, y: 2.0 отмечает «2× от опорной точки» и т. д.

Пример: наложение с привязкой к ATH (пользовательские цвета для каждого цикла)

Этот рецепт повторяет график дашборда «Price Performance Since ATH» — пять циклов, каждый своим цветом, на логарифмической оси.

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

Пример: наложение по минимуму цикла (сокращённая форма)

Для быстрого сравнения без индивидуального оформления циклов передайте идентификаторы метрик в виде простых строк — цвета берутся из палитры реестра автоматически.

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

Пример: наложение с привязкой к халвингу

Та же форма, четыре цикла с привязкой к каждому событию халвинга.

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-инструмент

Из ИИ-агента, подключённого к MCP-серверу, тот же график — это один вызов инструмента:

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"
})

MCP-сервер принимает тот же enum x_axis, те же идентификаторы метрик и те же правила валидации, что и HTTP API.


Управление легендой для отдельных метрик

Используйте show_in_legend в объектах конфигурации отдельных метрик, чтобы управлять отображением метрики в легенде графика. Это полезно при сочетании множества рядов, когда некоторые из них являются контекстными/фоновыми линиями.

{
"metrics": [
{"id": "price", "show_in_legend": true},
{"id": "sma_200", "show_in_legend": false}
]
}
ПолеТипПо умолчаниюОписание
show_in_legendbooleantrueОтображается ли метрика в легенде графика

Умные значения по умолчанию

Snapshot API использует интеллектуальные значения по умолчанию, чтобы вы могли получать отлично выглядящие графики с минимальной настройкой:

ПараметрКак определяется значение по умолчанию
Стиль графикаИз реестра метрик (chart_types[0])
ЦветИз реестра метрик, затем ротация по палитре
Сторона оси YПервая метрика слева; метрики с одинаковым форматом делят ось; другой формат — справа
Шкала оси Ylinear (переопределяется через scale=log)
Временной диапазонПо категории: 365 дней для price/valuation/profit, 730 для supply, 180 для blockchain
ЗаголовокОдна метрика: название метрики. Несколько: "Name1 vs Name2"
Размер изображения1200 x 600 пикселей
Темаlight

Ответы с ошибками

Все ошибки возвращаются в формате JSON:

// 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-инструмент: render_chart

MCP-сервер Blocklens включает инструмент render_chart, позволяющий ИИ-агентам генерировать изображения графиков прямо в диалогах. Инструмент вызывает Snapshot API и возвращает изображение встроенным образом либо как PNG (растр), либо как SVG (вектор).

Параметры

ПараметрТипПо умолчаниюОписание
metricstring-Идентификатор одной метрики
metricsarray-Несколько метрик (строки или объекты)
templatestring-Идентификатор шаблона
daysinteger365Дней истории
start_datestring-Начальная дата (YYYY-MM-DD)
end_datestring-Конечная дата (YYYY-MM-DD)
overlayprice-Добавить наложение цены (на данный момент BTC)
themelight / darklightЦветовая тема
widthinteger1200Ширина изображения
heightinteger600Высота изображения
titlestringautoЗаголовок графика
styleline / area / barautoСтиль графика
scalelinear / loglinearШкала оси Y
formatpng / svg / jsonpngФормат вывода: png (растровое изображение), svg (векторное изображение, масштабируется без потери качества) или json (только метаданные — без отрисовки)
y_axesarray-Пользовательские оси Y с зонами (см. Пользовательские оси Y)
x_axisdate / day_offsetdateРежим оси X. Используйте day_offset для наложений производительности циклов — все metrics должны быть из одного семейства циклов.
heatmap_idcost-basis-distribution-Отрисовать тепловую карту вместо линейного графика (см. Отрисовка тепловых карт). Взаимоисключающий с metric / metrics / template.
heatmap_period3m / 6m / 1y / 2y / 3y / 5y / all1yОкно группировки тепловой карты.
heatmap_color_scaleviridis / plasma / inferno / magma / cividisviridisЦветовая палитра тепловой карты.
heatmap_y_scalelinear / loglinearШкала оси Y для ценовых корзин тепловой карты.
paramsobject-Параметры на вызов для параметризованных метрик (например, { "exchange": "binance" }, { "ticker": "IBIT" }, { "entity": "tesla" }).
reference_linesarray-Горизонтальные опорные линии (см. Опорные линии и области)
reference_areasarray-Затенённые опорные зоны (см. Опорные линии и области)

Примеры использования

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

Добавьте в конфигурацию Claude Desktop или Cursor, чтобы включить отрисовку графиков:

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

Полные инструкции по настройке см. в разделе MCP Server.


Продвинутый пример: график LTH Supply

Этот пример воспроизводит полный график Long-Term Holder Supply из дашборда Blocklens — две метрики, два вычисляемых ряда-формулы и три оси Y:

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

Что это даёт:

  • BTC Price — серая линия на правой оси (логарифмическая шкала)
  • LTH Supply — синяя линия на левой оси (линейная)
  • 30-дневное положительное накопление — полупрозрачные зелёные столбцы на отдельной оси axis-diff
  • 30-дневное распределение — полупрозрачные красные столбцы на той же оси axis-diff

Использованные ключевые приёмы:

  • shift(lth_supply, 30) вычисляет значение с оглядкой на 30 дней назад
  • max(..., 0) и min(0, ...) разделяют положительные и отрицательные изменения на отдельные ряды
  • y_axis_id: "axis-diff" привязывает оба столбца формул к выделенной оси, независимой от основных осей метрик
  • fill_opacity: 0.2 + stroke_width: 0 создаёт неброские прозрачные столбцы без границ

Шаблоны графиков

Полные конфигурации графиков (включая метрики, формулы, оси и оформление) доступны в виде шаблонов на основе базы данных через:

GET /api/lab/templates

Эти шаблоны могут служить ориентиром при построении собственных тел POST-запросов. Каждый шаблон содержит полную конфигурацию, которая создаёт конкретный график в дашборде Blocklens.


Водяной знак

Все отрисованные изображения графиков содержат водяной знак blocklens.co и уведомление об авторских правах. Это относится как к формату PNG, так и к SVG.


Кэширование

Отрисованные снимки кэшируются на 1 час в Redis. Поведение кэша:

  • Идентичные конфигурации графиков мгновенно возвращают кэшированные результаты
  • Ключ кэша вычисляется из полной конфигурации графика (метрики, оси, временной диапазон, тема, размер) плюс формат вывода — варианты PNG и SVG одного и того же графика кэшируются независимо
  • Заголовок ответа X-Snapshot-Cache показывает HIT или MISS
  • Заголовок X-Snapshot-Render-Ms показывает время отрисовки (0 для попаданий в кэш)
  • Отрисованные файлы также сохраняются на диске по адресам /v1/chart/renders/{render_id}.png и /v1/chart/renders/{render_id}.svg в течение 1 часа, поэтому URL графиков, возвращаемые в заголовке X-Render-Id, остаются доступными
  • Популярные графики предварительно прогреваются после каждого ежедневного обновления данных (05:00 UTC)