본문으로 건너뛰기

스냅샷 API

스냅샷 API는 온체인 분석 차트를 PNG 이미지 또는 SVG 벡터 그래픽으로 렌더링합니다. 지표 ID와 선택적 표시 매개변수를 전송하면, 보고서, 대시보드 또는 AI 대화에 바로 삽입할 수 있는 완전히 렌더링된 차트 이미지를 받게 됩니다. 현재 Bitcoin 지표를 지원하며, 멀티체인 지원(ETH, TON, TRON)이 확대되고 있습니다.

엔드포인트

메서드경로설명
GET/v1/chart/snapshot쿼리 매개변수를 통한 간단한 차트
POST/v1/chart/snapshotJSON 본문을 통한 전체 커스터마이징

두 엔드포인트 모두 기본적으로 image/png를 반환합니다. Accept 요청 헤더를 설정하거나 — POST의 경우 — format 본문 필드("png", "svg", "json")를 설정하여 SVG(image/svg+xml) 또는 JSON 메타데이터(application/json)로 전환할 수 있습니다.

성공한 PNG 및 SVG 응답에는 X-Render-Id 헤더가 포함되어 있어, 렌더링된 차트를 1시간 이내에 URL로 다시 가져올 수 있습니다.

출력캐시 위치
PNGhttps://api.blocklens.co/v1/chart/renders/{X-Render-Id}.png
SVGhttps://api.blocklens.co/v1/chart/renders/{X-Render-Id}.svg

인증

모든 요청에는 Authorization 헤더를 통한 API 키가 필요합니다.

Authorization: Bearer YOUR_API_KEY

API 키 발급에 대한 자세한 내용은 인증을 참조하십시오.

접근 권한 및 속도 제한

스냅샷 API는 Pro 또는 Enterprise 등급이 필요합니다. Demo 및 Free 등급 키는 403 Forbidden을 받습니다.

스냅샷 API는 데이터 API와 동일한 속도 제한을 따릅니다. 자세한 내용은 속도 제한을 참조하십시오.

속도 제한에 도달하면 API는 retry_after 필드와 함께 429 Too Many Requests를 반환합니다.

지표 접근도 등급별로 제한됩니다. 등급 0 지표(price, supply, MVRV)는 모든 Pro+ 키에서 사용할 수 있고, 등급 1 지표(SOPR, P&L)는 Pro가 필요하며, 등급 2 지표(CBD 히트맵)는 Enterprise가 필요합니다.


GET /v1/chart/snapshot

쿼리 매개변수로부터 차트를 생성합니다. 간단한 단일 지표 또는 템플릿 기반 차트에 가장 적합합니다.

매개변수

매개변수유형기본값설명
metricstring-단일 지표 ID(예: price, lth_supply). metricstemplate과 상호 배타적입니다.
metricsstring-쉼표로 구분된 지표 ID, 최대 6개(예: lth_supply,sth_supply). metrictemplate과 상호 배타적입니다.
templatestring-사전 정의된 템플릿 ID. metricmetrics와 상호 배타적입니다.
daysinteger365과거 데이터 일수(7-10000).
start_datestring-시작일(YYYY-MM-DD). days보다 우선합니다.
end_datestring-종료일(YYYY-MM-DD). 기본값은 오늘입니다.
stylestringauto차트 스타일: line, area, bar. 생략하면 지표 레지스트리에서 자동 감지됩니다.
scalestringlinearY축 스케일: 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를 사용하는) AI 에이전트와 고급 사용자를 위해 설계되었습니다.

요청 본문

정확히 하나의 데이터 소스(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필수. 레지스트리의 지표 ID.
paramsobject매개변수화된 지표의 매개변수(예: {"exchange": "binance"}). 필수 매개변수는 지표 정의를 참조하십시오.
axisleft / rightY축 위치. 생략하면 자동 할당됩니다.
y_axis_idstringID로 특정 Y축에 바인딩(예: axis-diff). axis보다 우선합니다.
styleline / area / bar차트 스타일. 생략하면 레지스트리 기본값을 사용합니다.
colorstring16진수 색상(예: #2563eb). 생략하면 자동 할당됩니다.
labelstring표시 레이블. 생략하면 지표 이름을 사용합니다.
stroke_widthinteger선 너비(0-5). 기본값: 2. 테두리 없는 막대에는 0을 사용하십시오.
fill_opacityfloat채우기 불투명도(0.0-1.0). 투명한 막대에는 0.2와 같은 낮은 값을 사용하십시오.
stroke_dashstring대시 패턴(예: 5 5).
stack_groupstring누적 차트용 스택 그룹 ID.
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% 패딩을 제거합니다. 도메인 클램프가 하드 경계일 때 유용합니다(예: 0에서 제한된 드로다운).

y_axes를 생략하면 지표의 axis 값에 따라 축이 자동 생성됩니다.

예시: 수직 영역을 사용한 Price + Volume

볼륨 막대를 하단 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])를 차지합니다
  • 두 시리즈가 절대 겹치지 않아 깔끔한 누적 레이아웃이 만들어집니다

예시: 도메인 클램프를 사용한 드로다운

드로다운을 0(상단 가장자리)에서 제한하여 선이 영역 상단에 닿도록 합니다.

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"은 0 위의 자동 10% 패딩을 제거하여, 드로다운이 0%일 때 선이 상단에 닿도록 합니다
  • 가격은 로그 스케일로 오른쪽 축에 표시됩니다

수식

formulas 필드를 사용하면 지표에서 파생된 계산 시리즈를 정의할 수 있습니다. 수식은 지표를 id(예: lth_supply)로 참조하거나 위치 인덱스(metrics 배열의 순서에 따라 m1, m2 등)로 참조할 수 있습니다.

"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 — 지표 ID를 직접 사용
  • 위치로 지표 참조: m1 + m2 — 위치 참조(m1 = 첫 번째 지표, m2 = 두 번째 등)
  • 다른 수식 참조: f1 * 2 — 이전 수식 참조(f1 = 첫 번째 수식 등)
  • 수식은 순서대로 평가되므로 f2는 f1을 참조할 수 있지만 그 반대는 불가능합니다.

수식 옵션:

필드유형설명
expressionstring필수. 지표 ID 또는 위치 참조(m1, m2)를 사용하는 수식 표현식.
labelstring필수. 범례에 표시할 레이블.
colorstring16진수 색상. 생략하면 자동 할당됩니다.
styleline / area / bar차트 스타일. 기본값: line.
y_axis_idstringID로 특정 Y축에 바인딩(예: axis-diff). axis보다 우선합니다.
axisleft / rightY축 위치. 기본값: left. y_axis_id가 설정되면 무시됩니다.
fill_opacityfloat채우기 불투명도(0.0-1.0). 투명한 막대에는 0.2와 같은 낮은 값을 사용하십시오.
stroke_widthinteger선 너비(0-5). 테두리 없는 막대에는 0을 사용하십시오.
stroke_dashstring대시 패턴(예: 6 3).
stack_groupstring여러 수식 시리즈를 누적하기 위한 스택 그룹 ID.

참조선 및 영역

참조선은 특정 값(예: 1.0의 손익분기점, 과매수 임계값)을 강조하기 위해 수평 가이드선을 추가합니다. 참조 영역은 값 범위(예: 저평가 영역, 볼린저 밴드와 유사한 밴드)를 강조하기 위해 음영 영역을 추가합니다. 둘 다 formulas 필드와 동일한 수식 엔진을 사용하여 정적 값과 동적 수식을 지원합니다.

참조선 옵션

필드유형설명
ynumber정적 Y 값.
y_formulastring동적 Y를 위한 수식 표현식(예: "sma(m1, 200)"). formulas와 동일한 엔진을 사용합니다.
y_axis_idstringY축 ID(기본값은 첫 번째 왼쪽 축).
strokestring선 색상 16진수(기본값: #9ca3af).
stroke_dasharraystring대시 패턴, 예: 점선의 경우 "3 3".
labelstring레이블 텍스트.

y(정적) 또는 y_formula(동적) 중 하나를 제공하되, 둘 다 제공하지 마십시오. 차트당 최대 10개의 참조선을 사용할 수 있습니다.

참조 영역 옵션

필드유형설명
y1number정적 하한 Y 경계.
y2number정적 상한 Y 경계.
y1_formulastring동적 하한 경계를 위한 수식.
y2_formulastring동적 상한 경계를 위한 수식.
y_axis_idstringY축 ID(기본값은 첫 번째 왼쪽 축).
fillstring채우기 색상 16진수(기본값: #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

히트맵 렌더링

스냅샷 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_scalestringlinearY축 스케일: 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 또는 반감기)에 대해 인덱싱되고 해당 기준 이후 경과 일수에 대해 플롯됩니다.

POST /v1/chart/snapshot 요청에서 x_axis: "day_offset"을 설정하고 metrics 배열에 사이클 지표를 제공하여 오버레이 모드를 켭니다. 렌더러는 date 대신 각 데이터 포인트의 day_offset 필드를 사용하므로 모든 사이클이 X축의 0일에서 시작합니다.

눈금 레이블은 선택한 계열의 최신 사이클의 달력 날짜를 표시합니다. 예를 들어, ATH 오버레이(cycle_ath_1cycle_ath_5)는 2025-10-06에 기준을 두며 눈금은 Oct '25, Jan '26, Apr '26 등으로 읽힙니다 — Day 0, Day 90, Day 180이 아닙니다. 동일한 차트의 다른 사이클은 동일한 X축 위치에 정렬되므로, cycle_ath_3Apr '26 눈금에 찍힌 값은 "2017년 사이클이 시작된 지 182일째에 BTC가 어떤 상태였는지"를 뜻합니다. 백엔드가 기준 시점을 판단하지 못할 때에만 일수 번호 매기기(Day 0, Day 90 …)가 대체 표시로 다시 사용됩니다.

기준 유형

기준 이벤트별로 하나씩, 세 가지 사이클 지표 계열을 사용할 수 있습니다.

기준지표 ID 접두사설명엔드포인트 힌트
사이클 저점 → 다음 저점cycle_low_*사이클 바닥에 인덱싱된 가격 — 각 시리즈는 저점 날짜에 1.0에서 시작하여 다음 사이클의 저점까지 진행됩니다.endpoint: "cycle-performance?type=low"
ATH → ATHcycle_ath_*사이클의 사상 최고가에 인덱싱된 가격 — 각 시리즈는 ATH 날짜에 1.0에서 시작하여 다음 ATH까지 진행됩니다.endpoint: "cycle-performance?type=ath"
반감기 → 반감기cycle_halving_*반감기 블록에 인덱싱된 가격 — 각 시리즈는 반감기 날짜에 1.0에서 시작하여 다음 반감기까지 진행됩니다.endpoint: "cycle-performance?type=halving"

기준 계열 내에서 모든 사이클은 동일한 형태의 데이터입니다 — 1.0에서 시작하여 다음 기준 이벤트까지(또는 현재 사이클의 경우 오늘까지) price(t) / price(anchor)를 추적하는 인덱스입니다. 이것이 오버레이 비교를 의미 있게 만드는 요소입니다: cycle_ath_3의 200일째 값 5.0은 "BTC가 2017년 ATH 이후 200일 만에 그 ATH의 5배였다"는 것을 의미합니다.

사용 가능한 모든 사이클 지표

지표 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 → today (current cycle)
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 → today (current cycle)
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 → today (current cycle)
검증 규칙
  • 모든 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. 문자열 또는 객체({id, color, style, label, stroke_width, fill_opacity, show_in_legend, y_axis_id}).
daysinteger365렌더링되는 최대 일수 오프셋을 제한합니다(달력 날짜가 아닌 X축 범위). 사이클당 약 4년을 보려면 1500으로 설정하십시오.
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

예시: 사이클 저점 오버레이 (약식 형태)

사이클별 스타일링 없이 빠르게 비교하려면 지표 ID를 일반 문자열로 전달하십시오 — 색상은 레지스트리 팔레트에서 자동으로 적용됩니다.

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 서버에 연결된 AI 에이전트에서는 동일한 차트가 하나의 도구 호출입니다.

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 서버는 HTTP API와 동일한 x_axis 열거형, 동일한 지표 ID, 동일한 검증 규칙을 수용합니다.


지표별 범례 제어

개별 지표 구성 객체에서 show_in_legend를 사용하여 지표가 차트 범례에 나타날지 여부를 제어하십시오. 이는 일부가 컨텍스트/배경선인 여러 시리즈를 결합할 때 유용합니다.

{
"metrics": [
{"id": "price", "show_in_legend": true},
{"id": "sma_200", "show_in_legend": false}
]
}
필드유형기본값설명
show_in_legendbooleantrue지표가 차트 범례에 나타날지 여부

스마트 기본값

스냅샷 API는 지능적인 기본값을 사용하여 최소한의 구성으로 멋진 차트를 얻을 수 있게 합니다.

매개변수기본값 결정 방식
차트 스타일지표 레지스트리에서(chart_types[0])
색상지표 레지스트리에서, 그 다음 팔레트 회전
Y축 위치첫 번째 지표는 왼쪽; 동일 형식 지표는 축 공유; 다른 형식은 오른쪽
Y축 스케일linear(scale=log로 재정의)
기간 범위카테고리 기반: price/valuation/profit은 365일, supply는 730일, blockchain은 180일
제목단일 지표: 지표 이름. 다중: "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

Blocklens MCP 서버에는 AI 에이전트가 대화에서 직접 차트 이미지를 생성할 수 있게 하는 render_chart 도구가 포함되어 있습니다. 이 도구는 스냅샷 API를 호출하고 이미지를 PNG(래스터) 또는 SVG(벡터)로 인라인으로 반환합니다.

매개변수

매개변수유형기본값설명
metricstring-단일 지표 ID
metricsarray-여러 지표(문자열 또는 객체)
templatestring-템플릿 ID
daysinteger365과거 데이터 일수
start_datestring-시작일(YYYY-MM-DD)
end_datestring-종료일(YYYY-MM-DD)
overlayprice-가격 오버레이 추가(현재 BTC)
themelight / darklight색상 테마
widthinteger1200이미지 너비
heightinteger600이미지 높이
titlestringauto차트 제목
styleline / area / barauto차트 스타일
scalelinear / loglinearY축 스케일
formatpng / svg / jsonpng출력 형식: png(래스터 이미지), svg(품질 손실 없이 확장되는 벡터 이미지), 또는 json(메타데이터만 — 렌더링 없음)
y_axesarray-영역이 있는 사용자 정의 Y축(사용자 정의 Y축 참조)
x_axisdate / day_offsetdateX축 모드. 사이클 성과 오버레이에는 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 서버를 참조하십시오.


고급 예시: LTH Supply 차트

이 예시는 Blocklens 대시보드의 전체 Long-Term Holder Supply 차트를 복제합니다 — 두 개의 지표, 두 개의 계산된 수식 시리즈, 그리고 세 개의 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 출력 형식 모두에 적용됩니다.


캐싱

렌더링된 스냅샷은 Redis에 1시간 동안 캐시됩니다. 캐시 동작:

  • 동일한 차트 구성은 캐시된 결과를 즉시 반환합니다
  • 캐시 키는 전체 차트 구성(지표, 축, 기간 범위, 테마, 크기) 및 출력 형식에서 파생됩니다 — 동일한 차트의 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시간 동안 보존되므로, X-Render-Id 헤더에 반환된 차트 URL은 계속 접근 가능합니다
  • 인기 차트는 매일 데이터 업데이트(05:00 UTC) 후 사전 워밍됩니다