Pular para o conteúdo principal

API de Snapshot

A API de Snapshot renderiza gráficos de análise on-chain como imagens PNG ou gráficos vetoriais SVG. Envie IDs de métricas e parâmetros de exibição opcionais e receba uma imagem de gráfico totalmente renderizada, pronta para incorporar em relatórios, dashboards ou conversas com IA. Atualmente suporta métricas de Bitcoin, com cobertura multi-chain (ETH, TON, TRON) em expansão.

Endpoints​

MétodoCaminhoDescrição
GET/v1/chart/snapshotGráficos simples via parâmetros de query
POST/v1/chart/snapshotPersonalização completa via corpo JSON

Ambos os endpoints retornam image/png por padrão. Mude para SVG (image/svg+xml) ou metadados JSON (application/json) definindo o cabeçalho de requisição Accept ou — no POST — o campo format do corpo ("png", "svg", "json").

Respostas PNG e SVG bem-sucedidas incluem um cabeçalho X-Render-Id para que o gráfico renderizado possa ser obtido novamente por URL dentro de 1 hora:

SaídaEm cache em
PNGhttps://api.blocklens.co/v1/chart/renders/{X-Render-Id}.png
SVGhttps://api.blocklens.co/v1/chart/renders/{X-Render-Id}.svg

Autenticação​

Todas as requisições exigem uma chave de API através do cabeçalho Authorization:

Authorization: Bearer YOUR_API_KEY

Consulte Autenticação para detalhes sobre como obter chaves de API.

Acesso e Limites de Taxa​

A API de Snapshot exige o tier Pro ou Enterprise. Chaves dos tiers Demo e Free recebem 403 Forbidden.

A API de Snapshot segue os mesmos limites de taxa da Data API. Consulte Limites de Taxa para detalhes.

Quando o limite de taxa é atingido, a API retorna 429 Too Many Requests com um campo retry_after.

O acesso às métricas também é restrito por grau (grade): as métricas de grau 0 (price, supply, MVRV) estão disponíveis para todas as chaves Pro+, as de grau 1 (SOPR, P&L) exigem Pro e as de grau 2 (heatmaps de CBD) exigem Enterprise.


GET /v1/chart/snapshot​

Gere um gráfico a partir de parâmetros de query. Ideal para gráficos simples, de métrica única ou baseados em templates.

Parâmetros​

ParâmetroTipoPadrãoDescrição
metricstring-ID de uma única métrica (ex.: price, lth_supply). Mutuamente exclusivo com metrics e template.
metricsstring-IDs de métricas separados por vírgula, máximo 6 (ex.: lth_supply,sth_supply). Mutuamente exclusivo com metric e template.
templatestring-ID de template predefinido. Mutuamente exclusivo com metric e metrics.
daysinteger365Dias de dados históricos (7-10000).
start_datestring-Data inicial (YYYY-MM-DD). Sobrepõe days.
end_datestring-Data final (YYYY-MM-DD). Padrão: hoje.
stylestringautoEstilo do gráfico: line, area, bar. Detectado automaticamente a partir do registro de métricas se omitido.
scalestringlinearEscala do eixo Y: linear ou log.
overlaystring-Adiciona uma sobreposição de preço como uma linha tracejada sutil no eixo direito (use price). Atualmente preço do BTC.
widthinteger1200Largura da imagem em pixels (600-2400).
heightinteger600Altura da imagem em pixels (300-1200).
titlestringautoTítulo do gráfico. Gerado automaticamente a partir dos nomes das métricas se omitido.
themestringlightTema de cores: light ou dark.

Exatamente um entre metric, metrics ou template deve ser fornecido.

Templates Disponíveis​

TemplateMétricas
pricePreço do BTC
price_volumePreço + 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_heightAltura do Bloco

Exemplos​

# 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

Resposta de Sucesso​

PNG (padrão):

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

O valor X-Render-Id pode ser usado para obter novamente a mesma imagem em /v1/chart/renders/{render_id}.png ou /v1/chart/renders/{render_id}.svg por até 1 hora.


POST /v1/chart/snapshot​

Personalização completa do gráfico via corpo JSON. Suporta estilização por métrica, eixos personalizados, fórmulas, linhas de referência, áreas de referência e mais. Projetado para agentes de IA (via MCP) e usuários avançados.

Corpo da Requisição​

Forneça exatamente uma fonte de dados (metric, metrics ou 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"}
]
}

Nota: Exatamente um entre metric, metrics ou template deve ser fornecido.

Campo Metrics​

O campo metrics suporta tipos mistos:

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

Algumas métricas exigem parâmetros adicionais (ex.: exchange, ticker, id). Inclua o objeto params da definição da métrica ao usar essas métricas.

Opções por Métrica​

CampoTipoDescrição
idstringObrigatório. ID da métrica do registro.
paramsobjectParâmetros para métricas parametrizadas (ex.: {"exchange": "binance"}). Consulte a definição da métrica para os params obrigatórios.
axisleft / rightLado do eixo Y. Atribuído automaticamente se omitido.
y_axis_idstringVincula a um eixo Y específico por ID (ex.: axis-diff). Sobrepõe axis.
styleline / area / barEstilo do gráfico. Padrão do registro se omitido.
colorstringCor hexadecimal (ex.: #2563eb). Atribuída automaticamente se omitida.
labelstringRótulo de exibição. Usa o nome da métrica se omitido.
stroke_widthintegerLargura da linha (0-5). Padrão: 2. Use 0 para barras sem bordas.
fill_opacityfloatOpacidade de preenchimento (0.0-1.0). Para barras transparentes, use valores baixos como 0.2.
stroke_dashstringPadrão de tracejado (ex.: 5 5).
stack_groupstringID do grupo de empilhamento para gráficos empilhados.
show_in_legendbooleanSe deve aparecer na legenda do gráfico. Padrão: true.
visiblebooleanMostrar/ocultar. Padrão: true.

Eixos Y Personalizados​

O campo y_axes define os eixos Y disponíveis para métricas e fórmulas. Cada eixo tem um id único que pode ser referenciado via y_axis_id em métricas ou fórmulas. Você pode definir mais de dois eixos — por exemplo, um eixo separado para diferenças computadas:

"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"}
]
CampoTipoDescrição
idstringIdentificador único do eixo. Referenciado por y_axis_id em métricas/fórmulas.
sideleft / rightEm qual lado do gráfico o eixo aparece.
scalelinear / logEscala do eixo. Padrão: linear.
formatnumber / currency / percentFormato numérico para os rótulos do eixo.
range[number, number]Zona vertical como [from%, to%]. 0 = inferior, 100 = superior. Padrão: altura total. Use para empilhar eixos verticalmente (ex.: volume nos 20% inferiores, preço nos 80% superiores).
domain_minnumberLimite mínimo rígido do domínio. O eixo nunca ficará abaixo desse valor.
domain_maxnumberLimite máximo rígido do domínio. O eixo nunca ficará acima desse valor.
no_padding"top" / "bottom" / "both"Remove o padding automático de 10% das bordas. Útil quando um limite de domínio é uma fronteira rígida (ex.: drawdown limitado a 0).

Se y_axes for omitido, os eixos são gerados automaticamente com base nos valores de axis das métricas.

Exemplo: Preço + Volume com Zonas Verticais​

Empilhe barras de volume nos 20% inferiores e o preço no espaço restante:

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

O que isso produz:

  • As barras de volume preenchem os 20% inferiores do gráfico (range: [0, 20]) sem padding na borda inferior
  • O preço ocupa os 80% superiores (range: [20, 100]) em escala log
  • As duas séries nunca se sobrepõem, criando um layout empilhado limpo

Exemplo: Drawdown com Limite de Domínio​

Limite o drawdown a 0 (borda superior) para que a linha toque o topo da sua zona:

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

O que isso produz:

  • O drawdown é sempre ≤ 0, então domain_max: 0 limita a borda superior
  • no_padding: "top" remove o padding automático de 10% acima de 0, fazendo a linha tocar o topo quando o drawdown é 0%
  • O preço está no eixo direito com escala log

Fórmulas​

O campo formulas permite definir séries computadas derivadas de suas métricas. As fórmulas podem referenciar métricas pelo seu id (ex.: lth_supply) ou por índice posicional (m1, m2, etc. com base na ordem no array 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
}
]

Funções suportadas (30 no total):

Médias Móveis e Estatísticas de Janela Móvel​

FunçãoSintaxeDescrição
smasma(series, period)Média Móvel Simples
emaema(series, period)Média Móvel Exponencial
medianmedian(series, period)Mediana móvel
sumsum(series, period)Soma móvel
stdstd(series, period)Desvio padrão móvel

Cumulativas​

FunçãoSintaxeDescrição
cumsumcumsum(series)Soma cumulativa expansiva
cummeancummean(series)Média cumulativa expansiva
cummediancummedian(series)Mediana cumulativa expansiva
cumstdcumstd(series)Desvio padrão cumulativo expansivo
cummaxcummax(series)Máximo cumulativo de todos os tempos
cummincummin(series)Mínimo cumulativo de todos os tempos

Variações​

FunçãoSintaxeDescrição
percent_changepercent_change(series, period)Variação percentual (decimal: 0.20 = +20%)
diffdiff(series, period)Variação em valor absoluto

Matemática​

FunçãoSintaxeDescrição
absabs(series)Valor absoluto
powpow(series, n)Elevar à potência n
loglog(series)Logaritmo de base 10
roundround(series, digits)Arredondar para N casas decimais
maxmax(a, b, ...)Máximo ponto a ponto
minmin(a, b, ...)Mínimo ponto a ponto

Indicadores Técnicos​

FunçãoSintaxeDescrição
rsirsi(series, period)Índice de Força Relativa (0-100)
corrcorr(s1, s2, period)Correlação de Pearson (-1 a 1)
drawdowndrawdown(series)Drawdown a partir do ATH (decimal negativo)

Risco e Retorno​

FunçãoSintaxeDescrição
mean_returnmean_return(series, period)Retorno médio móvel anualizado
realized_volrealized_vol(series, period)Volatilidade realizada anualizada
sharpe_ratio_arithmeticsharpe_ratio_arithmetic(series, period)Índice de Sharpe (aritmético)
sharpe_ratio_geometricsharpe_ratio_geometric(series, period)Índice de Sharpe (geométrico)

Manipulação de Séries​

FunçãoSintaxeDescrição
shiftshift(series, period)Desloca a série por N períodos
ifif(a, "op", b, then, else)Condicional (op: =, !=, >, >=, <, <=)

Operadores​

Aritméticos: +, -, *, / Agrupamento: (, )

Referenciamento​

  • Métricas por nome: lth_supply + sth_supply — use os IDs das métricas diretamente
  • Métricas por posição: m1 + m2 — referências posicionais (m1 = primeira métrica, m2 = segunda, etc.)
  • Outras fórmulas: f1 * 2 — referenciar fórmulas anteriores (f1 = primeira fórmula, etc.)
  • As fórmulas são avaliadas em ordem, então f2 pode referenciar f1, mas não o contrário.

Opções de fórmula:

CampoTipoDescrição
expressionstringObrigatório. Expressão de fórmula usando IDs de métricas ou refs posicionais (m1, m2).
labelstringObrigatório. Rótulo de exibição para a legenda.
colorstringCor hexadecimal. Atribuída automaticamente se omitida.
styleline / area / barEstilo do gráfico. Padrão: line.
y_axis_idstringVincula a um eixo Y específico por ID (ex.: axis-diff). Sobrepõe axis.
axisleft / rightLado do eixo Y. Padrão: left. Ignorado se y_axis_id for definido.
fill_opacityfloatOpacidade de preenchimento (0.0-1.0). Para barras transparentes, use valores baixos como 0.2.
stroke_widthintegerLargura do traço (0-5). Use 0 para barras sem bordas.
stroke_dashstringPadrão de tracejado (ex.: 6 3).
stack_groupstringID do grupo de empilhamento para empilhar várias séries de fórmula.

Linhas e Áreas de Referência​

Linhas de referência adicionam linhas-guia horizontais para destacar valores específicos (ex.: break-even em 1.0, limiar de sobrecompra). Áreas de referência adicionam zonas sombreadas para destacar faixas de valores (ex.: zona de subvalorização, bandas tipo Bollinger). Ambas suportam valores estáticos e fórmulas dinâmicas usando o mesmo motor de fórmulas do campo formulas.

Opções de Linha de Referência​

CampoTipoDescrição
ynumberValor Y estático.
y_formulastringExpressão de fórmula para Y dinâmico (ex.: "sma(m1, 200)"). Usa o mesmo motor que formulas.
y_axis_idstringID do eixo Y (padrão: primeiro eixo esquerdo).
strokestringCor hexadecimal da linha (padrão: #9ca3af).
stroke_dasharraystringPadrão de tracejado, ex.: "3 3" para tracejado.
labelstringTexto do rótulo.

Forneça y (estático) ou y_formula (dinâmico), não ambos. Máximo de 10 linhas de referência por gráfico.

Opções de Área de Referência​

CampoTipoDescrição
y1numberLimite Y inferior estático.
y2numberLimite Y superior estático.
y1_formulastringFórmula para o limite inferior dinâmico.
y2_formulastringFórmula para o limite superior dinâmico.
y_axis_idstringID do eixo Y (padrão: primeiro eixo esquerdo).
fillstringCor hexadecimal de preenchimento (padrão: #3b82f6).
fill_opacitynumberOpacidade de preenchimento 0–1 (padrão: 0.1).
labelstringTexto do rótulo.

Forneça limites estáticos (y1/y2) ou baseados em fórmula (y1_formula/y2_formula) — você pode misturá-los (ex.: y1 estático com y2_formula dinâmico). Máximo de 10 áreas de referência por gráfico.

Exemplo: MVRV com Zonas de Valor​

Adicione uma zona verde de subvalorização (0–0.85), uma zona vermelha de sobrevalorização (8–100) e uma linha de break-even tracejada em 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

Exemplo: Banda Baseada em Fórmula​

Crie uma banda tipo Bollinger ao redor da primeira fórmula (envelope de ±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

Formato de Saída​

O campo format controla a saída:

FormatoContent-TypeDescrição
png (padrão)image/pngImagem de gráfico rasterizada
svgimage/svg+xmlGráficos vetoriais (escaláveis, incorporáveis)
jsonapplication/jsonMetadados do gráfico (sem renderização)

Alternativamente, use o cabeçalho Accept:

  • Accept: image/png - PNG (padrão)
  • Accept: image/svg+xml - SVG
  • Accept: application/json - metadados JSON

Resposta de Metadados JSON​

Quando format=json ou 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
}

Exemplos​

# 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

Renderização de Heatmap​

A API de Snapshot pode renderizar gráficos de heatmap para métricas baseadas em distribuição, como a Distribuição de Cost Basis. Os heatmaps usam um conjunto de parâmetros separado dos gráficos de métricas padrão.

Parâmetros de Heatmap​

ParâmetroTipoPadrãoDescrição
heatmap_idstring-Identificador do heatmap (ex.: cost-basis-distribution)
heatmap_periodstring1yPeríodo de tempo: 3m, 6m, 1y, 2y, 3y, 5y, all
heatmap_color_scalestringviridisEscala de cores: viridis, plasma, inferno, magma, cividis
heatmap_y_scalestringlinearEscala do eixo Y: linear ou log
themestringlightTema de cores: light ou dark
titlestringautoTítulo do gráfico
widthinteger1200Largura da imagem em pixels
heightinteger600Altura da imagem em pixels

Exemplo​

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

Nota: Os parâmetros de heatmap (heatmap_id, etc.) são mutuamente exclusivos com os parâmetros de métrica padrão (metric, metrics, template). As métricas de heatmap exigem o tier Enterprise.

A legenda da escala de cores é incluída na imagem renderizada, mostrando a faixa de valores mapeada para a paleta de cores selecionada.


Gráficos de Sobreposição de Desempenho de Ciclo​

Os gráficos de desempenho de ciclo sobrepõem múltiplos ciclos do Bitcoin no mesmo eixo X para que você possa compará-los de forma equivalente. Em vez de plotar contra datas de calendário, o preço de cada ciclo é indexado ao seu próprio evento âncora (fundo do ciclo, ATH ou halving) e plotado contra dias desde essa âncora.

Ative o modo de sobreposição definindo x_axis: "day_offset" em uma requisição POST /v1/chart/snapshot e fornecendo métricas de ciclo no array metrics. O renderizador usa o campo day_offset em cada ponto de dados em vez de date, de modo que todos os ciclos começam no Dia 0 no eixo X.

Os rótulos de marcação mostram datas de calendário do ciclo mais recente da família escolhida. Por exemplo, uma sobreposição de ATH (cycle_ath_1…cycle_ath_5) ancora em 2025-10-06 e as marcações exibem Oct '25, Jan '26, Apr '26, etc. — não Day 0, Day 90, Day 180. Os outros ciclos no mesmo gráfico são alinhados às mesmas posições do eixo X, então um valor na marcação Apr '26 em cycle_ath_3 significa "o que o BTC estava fazendo no 182º dia do ciclo de 2017". A numeração por dias reaparece como fallback apenas se o backend não conseguir determinar a âncora.

Tipos de Âncora​

Três famílias de métricas de ciclo estão disponíveis, uma por evento âncora:

ÂncoraPrefixo do ID da MétricaDescriçãoDica de endpoint
Fundo do ciclo → próximo fundocycle_low_*Preço indexado ao fundo do ciclo — cada série começa em 1.0 na data do fundo e vai até o fundo do próximo ciclo.endpoint: "cycle-performance?type=low"
ATH → ATHcycle_ath_*Preço indexado ao recorde histórico do ciclo — cada série começa em 1.0 na data do ATH e vai até o próximo ATH.endpoint: "cycle-performance?type=ath"
Halving → halvingcycle_halving_*Preço indexado ao bloco do halving — cada série começa em 1.0 na data do halving e vai até o próximo halving.endpoint: "cycle-performance?type=halving"

Dentro de uma família de âncora, cada ciclo é o mesmo formato de dados — um índice que começa em 1.0 e acompanha price(t) / price(anchor) até o próximo evento âncora (ou, para o ciclo atual, até hoje). É isso que torna a comparação por sobreposição significativa: um valor de 5.0 no dia 200 de cycle_ath_3 significa "o BTC valia 5× o seu ATH de 2017, 200 dias após esse ATH".

Todas as Métricas de Ciclo Disponíveis​

ID da MétricaData da âncoraÂncora → data final
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 → hoje (ciclo atual)
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 → hoje (ciclo atual)
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 → hoje (ciclo atual)
Regras de validação
  • Todas as metrics devem vir da mesma família de âncora. Misturar cycle_ath_* com cycle_low_* (ou qualquer coisa fora de daily_cycle_performance) retorna 400 invalid_params.
  • A flag x_axis: "day_offset" é válida apenas para métricas de ciclo — combiná-la com qualquer outra métrica retorna 400 invalid_params.
  • Aplica-se o limite padrão de "máximo 6 métricas por gráfico" — escolha até 6 ciclos por sobreposição.

Parâmetros de Desempenho de Ciclo​

Além de todos os parâmetros de gráfico padrão (days, width, height, theme, scale, format, title, y_axes, reference_lines, reference_areas, formulas, etc.), o modo de sobreposição de ciclo usa estes campos:

CampoTipoPadrãoDescrição
x_axis"date" / "day_offset""date"Defina como "day_offset" para habilitar a sobreposição de ciclo. Caso contrário, o eixo X é por data de calendário.
metricsarrayobrigatório1–6 IDs de métricas de ciclo da mesma família de âncora. Strings ou objetos ({id, color, style, label, stroke_width, fill_opacity, show_in_legend, y_axis_id}).
daysinteger365Limita o deslocamento máximo de dias renderizado (faixa do eixo X, não dias de calendário). Defina como 1500 para ver ~4 anos por ciclo.
scale"linear" / "log""linear"A escala log é quase sempre o que você quer — os multiplicadores dos primeiros ciclos podem ser de 100×–500×, o que é ilegível em escala linear.
theme"light" / "dark""light"O tema escuro é o padrão do dashboard para esses gráficos.

As linhas de referência (reference_lines) são particularmente úteis em gráficos de sobreposição — ex.: uma linha horizontal em y: 1.0 marca o nível da âncora, y: 2.0 marca "2× a âncora" e assim por diante.

Exemplo: Sobreposição Ancorada no ATH (Cores Personalizadas por Ciclo)​

Esta receita corresponde ao gráfico "Price Performance Since ATH" do dashboard — cinco ciclos, cada um em uma cor distinta, em um eixo log.

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

Exemplo: Sobreposição de Fundo de Ciclo (Forma Abreviada)​

Para uma comparação rápida sem estilização por ciclo, passe os IDs das métricas como strings simples — as cores vêm automaticamente da paleta do registro.

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

Exemplo: Sobreposição Ancorada no Halving​

Mesmo formato, quatro ciclos ancorados em cada evento de halving.

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

Equivalente em Ferramenta MCP​

A partir de um agente de IA conectado ao servidor MCP, o mesmo gráfico é uma única chamada de ferramenta:

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

O servidor MCP aceita o mesmo enum x_axis, os mesmos IDs de métricas e as mesmas regras de validação que a API HTTP.


Controle de Legenda por Métrica​

Use show_in_legend em objetos de configuração de métrica individuais para controlar se uma métrica aparece na legenda do gráfico. Isso é útil ao combinar muitas séries onde algumas são linhas de contexto/fundo.

{
"metrics": [
{"id": "price", "show_in_legend": true},
{"id": "sma_200", "show_in_legend": false}
]
}
CampoTipoPadrãoDescrição
show_in_legendbooleantrueSe a métrica aparece na legenda do gráfico

Padrões Inteligentes​

A API de Snapshot usa padrões inteligentes para que você consiga gráficos com ótima aparência com configuração mínima:

ParâmetroComo o Padrão É Determinado
Estilo do gráficoA partir do registro de métricas (chart_types[0])
CorA partir do registro de métricas, depois rotação de paleta
Lado do eixo YPrimeira métrica à esquerda; métricas de mesmo formato compartilham o eixo; formato diferente à direita
Escala do eixo Ylinear (sobreponha com scale=log)
Faixa de tempoBaseada em categoria: 365 dias para price/valuation/profit, 730 para supply, 180 para blockchain
TítuloMétrica única: nome da métrica. Múltiplas: "Name1 vs Name2"
Tamanho da imagem1200 x 600 pixels
Temalight

Respostas de Erro​

Todos os erros retornam 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."}

Ferramenta MCP: render_chart​

O servidor MCP do Blocklens inclui uma ferramenta render_chart que permite a agentes de IA gerar imagens de gráficos diretamente nas conversas. A ferramenta chama a API de Snapshot e retorna a imagem inline como PNG (raster) ou SVG (vetorial).

Parâmetros​

ParâmetroTipoPadrãoDescrição
metricstring-ID de uma única métrica
metricsarray-Múltiplas métricas (strings ou objetos)
templatestring-ID do template
daysinteger365Dias de histórico
start_datestring-Data inicial (YYYY-MM-DD)
end_datestring-Data final (YYYY-MM-DD)
overlayprice-Adiciona sobreposição de preço (atualmente BTC)
themelight / darklightTema de cores
widthinteger1200Largura da imagem
heightinteger600Altura da imagem
titlestringautoTítulo do gráfico
styleline / area / barautoEstilo do gráfico
scalelinear / loglinearEscala do eixo Y
formatpng / svg / jsonpngFormato de saída: png (imagem raster), svg (imagem vetorial, escala sem perda de qualidade) ou json (apenas metadados — sem renderização)
y_axesarray-Eixos Y personalizados com zonas (consulte Eixos Y Personalizados)
x_axisdate / day_offsetdateModo do eixo X. Use day_offset para sobreposições de desempenho de ciclo — todas as metrics devem ser da mesma família de ciclo.
heatmap_idcost-basis-distribution-Renderiza um heatmap em vez de um gráfico de linha (consulte Renderização de Heatmap). Mutuamente exclusivo com metric / metrics / template.
heatmap_period3m / 6m / 1y / 2y / 3y / 5y / all1yJanela de agrupamento do heatmap.
heatmap_color_scaleviridis / plasma / inferno / magma / cividisviridisPaleta de cores do heatmap.
heatmap_y_scalelinear / loglinearEscala do eixo Y de faixas de preço do heatmap.
paramsobject-Parâmetros por chamada para métricas parametrizadas (ex.: { "exchange": "binance" }, { "ticker": "IBIT" }, { "entity": "tesla" }).
reference_linesarray-Linhas de referência horizontais (consulte Linhas e Áreas de Referência)
reference_areasarray-Zonas de referência sombreadas (consulte Linhas e Áreas de Referência)

Exemplos de Uso​

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

Configuração do MCP​

Adicione à sua configuração do Claude Desktop ou Cursor para habilitar a renderização de gráficos:

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

Consulte Servidor MCP para instruções completas de configuração.


Exemplo Avançado: Gráfico de LTH Supply​

Este exemplo replica o gráfico completo de Long-Term Holder Supply do dashboard do Blocklens — duas métricas, duas séries de fórmula computadas e três eixos 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

O que isso produz:

  • BTC Price — linha cinza no eixo direito (escala log)
  • LTH Supply — linha azul no eixo esquerdo (linear)
  • Acumulação positiva de 30 dias — barras verdes semitransparentes em um eixo axis-diff separado
  • Distribuição de 30 dias — barras vermelhas semitransparentes no mesmo eixo axis-diff

Técnicas-chave utilizadas:

  • shift(lth_supply, 30) calcula o valor retrospectivo de 30 dias
  • max(..., 0) e min(0, ...) separam variações positivas e negativas em séries distintas
  • y_axis_id: "axis-diff" vincula ambas as barras de fórmula a um eixo dedicado, independente dos eixos das métricas principais
  • fill_opacity: 0.2 + stroke_width: 0 cria barras transparentes sutis e sem bordas

Templates de Gráfico​

Configurações completas de gráficos (incluindo métricas, fórmulas, eixos e estilização) estão disponíveis como templates apoiados por banco de dados via:

GET /api/lab/templates

Esses templates podem servir de referência para construir seus próprios corpos de requisição POST. Cada template contém a configuração completa que produz um gráfico específico no dashboard do Blocklens.


Marca d'água​

Todas as imagens de gráficos renderizadas incluem uma marca d'água blocklens.co e um aviso de copyright. Isso se aplica tanto ao formato de saída PNG quanto SVG.


Cache​

Os snapshots renderizados ficam em cache por 1 hora no Redis. Comportamento do cache:

  • Configurações de gráfico idênticas retornam resultados em cache instantaneamente
  • A chave de cache é derivada da configuração completa do gráfico (métricas, eixos, faixa de tempo, tema, tamanho) mais o formato de saída — as variantes PNG e SVG do mesmo gráfico são armazenadas em cache de forma independente
  • O cabeçalho de resposta X-Snapshot-Cache indica HIT ou MISS
  • O cabeçalho X-Snapshot-Render-Ms mostra o tempo de renderização (0 para acertos de cache)
  • Os arquivos renderizados também são persistidos em disco em /v1/chart/renders/{render_id}.png e /v1/chart/renders/{render_id}.svg por 1 hora, de modo que as URLs de gráfico retornadas no cabeçalho X-Render-Id permaneçam acessíveis
  • Os gráficos populares são pré-aquecidos após cada atualização diária de dados (05:00 UTC)