GET
/api/v1/indicators/bull-market-peakHobbyist tier+ · 30 req/minAggregated cycle-signal dashboard — the JSON mirror of /indicators/bull-market-peak.
Every bull-market-peak signal computed in one shot: Pi Cycle, MVRV, MVRV Z-Score, 2Y MA Multiplier, Rainbow, NVT, Puell (Pro-gated), RHODL (Pro-gated). Each entry carries both a machine-readable `state` (status + score) and human-friendly `description` / `thresholdLabel` strings. `aggregate` is the dashboard-level heat score; `heat` is in [0, 1].
Query parameters
All query parameters are optional unless marked required.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| asset | string | optional | BTC | Short alphabetic asset code. Non-BTC assets are accepted but most signals will only fire when we have enough CoinMetrics coverage for them. |
Response shape
Always wrapped in the standard envelope. Nullable fields are explicitly marked — treat missing numeric data as a real data-source gap, not as an error.
data payloadtypescript
// Wrapped in the standard envelope:
// {
// data: /* shape below */,
// meta?: { total?: number; limit?: number; offset?: number; ... }
// }
{
asset: string;
hasAnyData: boolean;
hasSufficientData: boolean;
aggregate: {
triggered: number;
total: number;
heat: number; // 0–1
tone: "calm" | "warming" | "hot";
};
signals: Array<{
key: string;
name: string;
description: string;
thresholdLabel: string;
unitLabel: string;
state: {
status: "accumulate" | "neutral" | "distribute" | "sell";
current: number;
threshold: number;
score: 0 | 1 | 2 | 3;
};
available: boolean;
unavailableReason?: "pro_metric" | "insufficient_data" | "no_data";
sparkline: number[];
}>;
}Example
Copy the curl, replace YOUR_KEY with a real key from your dashboard, and run.
Requestbash
curl -sS "http://localhost:3000/api/v1/indicators/bull-market-peak"Responsejson
{
"data": {
"asset": "BTC",
"hasAnyData": true,
"hasSufficientData": true,
"aggregate": { "triggered": 2, "total": 6, "heat": 0.41, "tone": "warming" },
"signals": [
{
"key": "pi-cycle",
"name": "Pi Cycle Top",
"description": "111-DMA crossing above 2× 350-DMA — historic top marker.",
"thresholdLabel": "111-DMA ≥ 2× 350-DMA",
"unitLabel": "USD",
"state": { "status": "neutral", "current": 54210, "threshold": 68400, "score": 1 },
"available": true,
"sparkline": []
}
]
},
"meta": { "total": 8, "asset": "BTC" }
}Notes
- Puell Multiple and RHODL Ratio remain Pro-tier metrics and return `available: false, unavailableReason: "pro_metric"`.
- Thresholds are the same ones rendered on /indicators/bull-market-peak — documented per signal in `cycle-signals.ts`.
Next
Check the error code reference, or get an API key to try the request against your own account.