GET
/api/v1/indicators/pi-cycleHobbyist tier+ · 30 req/minPi Cycle Top signal — 111-DMA vs 2× 350-DMA crossover.
Isolated Pi Cycle reading extracted from the aggregate cycle dashboard. Fires when the 111-day price SMA crosses above twice the 350-day SMA. Needs at least 350 daily samples — below that the signal is `available: false`.
Query parameters
All query parameters are optional unless marked required.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| asset | string | optional | BTC | Short alphabetic asset code. |
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;
signal: {
key: "pi-cycle";
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[];
} | null;
}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/pi-cycle"Responsejson
{
"data": {
"asset": "BTC",
"signal": {
"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": [50120, 50890, 51420]
}
},
"meta": { "total": 1, "asset": "BTC" }
}Notes
- Signal definition matches the `piCycleSignal` function in `cycle-signals.ts`.
Next
Check the error code reference, or get an API key to try the request against your own account.