GET /pulse/{coin}
GET /pulse/{coin}
Section titled “GET /pulse/{coin}”Multi-timeframe technical analysis for one Hyperliquid perpetual: indicators computed on closed candles for each requested timeframe, a derivatives snapshot, the market regime and a confluence vote share.
Request
Section titled “Request”GET https://api.cerebruspulse.xyz/pulse/{coin}Path Parameters
Section titled “Path Parameters”| Parameter | Type | Required | Description |
|---|---|---|---|
coin | string | Yes | Market symbol, case-insensitive (BTC, ETH, SOL). Hyperliquid’s name for a 1000-token market (kPEPE) works too. GET /coins lists them. |
Query Parameters
Section titled “Query Parameters”| Parameter | Type | Default | Description |
|---|---|---|---|
timeframes | string | 1h,4h | Comma-separated, from 5m, 15m, 1h, 4h, 1d, 1w. 1d and 1w are built from 1h candles. |
An unknown coin (404) or timeframe (400) is refused before any price is quoted.
Response
Section titled “Response”Top level
Section titled “Top level”| Field | Type | Description |
|---|---|---|
coin | string | The symbol, upper-case (PEPE, not kPEPE) |
market_symbol | string | Hyperliquid’s name for the market (kPEPE for PEPE) |
price_unit | string | What prices are quoted per, and what sizes count: 1 BTC, or 1000 PEPE for a 1000-token market |
timestamp_iso | string | When the response was computed (UTC) |
price.current | number | Hyperliquid mid price in USD per price_unit. Absent if the price feed has no mid for the market |
timeframes | object | One entry per requested timeframe, keyed by timeframe ("1h") |
derivatives | object | Funding, open interest and impact prices. Empty if Hyperliquid’s context lacks the market |
regime | object | The market regime |
confluence | object | A vote share across four indicators |
meta | object | Common metadata (Response Schemas) |
Per timeframe
Section titled “Per timeframe”Indicators use closed candles only; the candle still forming is never included.
| Field | Type | Description |
|---|---|---|
timeframes.<tf>.indicators.rsi_14 | number | null | RSI (14, Wilder’s smoothing), 0–100 |
timeframes.<tf>.indicators.rsi_zone | string | overbought (≥ 70), bullish (60–70), neutral (40–60), bearish (30–40), oversold (≤ 30), unknown |
timeframes.<tf>.indicators.atr_14 | number | null | Average true range (14), in price units |
timeframes.<tf>.indicators.atr_pct | number | null | ATR as a percentage of the last close |
timeframes.<tf>.indicators.ema_20 | number | null | 20-period EMA of closes; null with fewer than 20 candles |
timeframes.<tf>.indicators.ema_50 | number | null | 50-period EMA; null with fewer than 50 candles |
timeframes.<tf>.indicators.ema_200 | number | null | 200-period EMA; null with fewer than 200 candles |
timeframes.<tf>.indicators.vwap_20 | number | null | Volume-weighted average close of the last 20 candles |
timeframes.<tf>.indicators.zscore_100 | number | null | Z-score of the last close against the last 100 closes |
timeframes.<tf>.indicators.bollinger.upper | number | 20-period SMA + 2 standard deviations |
timeframes.<tf>.indicators.bollinger.middle | number | 20-period SMA |
timeframes.<tf>.indicators.bollinger.lower | number | 20-period SMA − 2 standard deviations |
timeframes.<tf>.indicators.bollinger.width_pct | number | (upper − lower) / middle, as a percentage |
timeframes.<tf>.indicators.bollinger.position_pct | number | Where the last close sits in the bands as a fraction: 0 = lower band, 1 = upper band; outside 0–1 when the close is outside the bands |
timeframes.<tf>.indicators.trend.direction | number | 1, -1 or 0 |
timeframes.<tf>.indicators.trend.label | string | bullish (price > EMA20 > EMA50 > EMA200), bearish (the reverse), weak_bullish (above EMA200 otherwise), weak_bearish (below it), neutral, or insufficient_data (fewer than 200 candles) |
timeframes.<tf>.indicators.trend.ema_stack | string | bull_aligned, bear_aligned, mixed, flat, or unknown with insufficient_data |
timeframes.<tf>.candle_freshness_seconds | number | Seconds since the newest closed candle closed |
timeframes.<tf>.last_closed_candle_time | string | When the newest closed candle closed (ISO 8601, UTC) |
timeframes.<tf>.stale | boolean | true when no candle has closed for two intervals (the candle feed stalled) |
timeframes.<tf>.error | string | Optional. Replaces the fields above when a timeframe cannot be computed, e.g. insufficient_data (12 candles). If every requested timeframe fails, the request gets a 400 and is not charged |
Derivatives
Section titled “Derivatives”| Field | Type | Description |
|---|---|---|
derivatives.funding_rate | number | Current Hyperliquid funding rate per hour. 0.0000125 (0.00125% an hour) is Hyperliquid’s baseline |
derivatives.funding_annualized_pct | number | funding_rate × 24 × 365 × 100: the baseline annualizes to 10.95% |
derivatives.funding_interval_hours | number | 1: Hyperliquid pays funding every hour |
derivatives.open_interest | number | Open interest counted in price_unit (BTC for BTC), not USD. Multiply by price.current for USD notional |
derivatives.impact_bid | number | Hyperliquid’s impact bid: the average fill price of an impact-size market sell, not the top of the book |
derivatives.impact_ask | number | Hyperliquid’s impact ask |
derivatives.impact_spread_bps | number | (impact_ask − impact_bid) / mid × 10000 |
derivatives.spread_bps | number | Deprecated: the same value as impact_spread_bps |
Regime
Section titled “Regime”| Field | Type | Description |
|---|---|---|
regime.current | string | The market regime label published by the trading system, lower-case (for example risk_on, risk_off), or unknown when none is published. Treat values you do not recognize as opaque |
regime.as_of | number | Unix time in seconds (may be fractional) the regime was set; 0 when unknown |
regime.stale | boolean | Optional. Added by the gateway when the regime is more than 6 hours old; current is then the last known regime, not a live one |
regime.age_seconds | number | Optional. With stale: how old the regime is |
regime.note | string | Optional. With stale: a sentence saying so |
Confluence
Section titled “Confluence”The confluence score is a vote share, not a confidence or probability, and it has not been validated as predictive. Four indicators vote on the primary timeframe: bullish counts 1, neutral 0.5, bearish 0.
| Field | Type | Description |
|---|---|---|
confluence.score | number | The primary timeframe’s vote share, 0–1, to 2 decimals: 1 = every vote bullish, 0.5 = balanced or neutral, 0 = every vote bearish. Sort by it to rank bullish to bearish, not by strength |
confluence.bull_fraction | number | null | The same share to 3 decimals |
confluence.bias | string | bullish (share ≥ 0.625), bearish (≤ 0.375), neutral, or unknown when no timeframe computed |
confluence.signals.rsi | string | RSI ≥ 60 bullish, ≤ 40 bearish, else neutral |
confluence.signals.trend | string | The EMA trend direction |
confluence.signals.bollinger | string | Mean reversion: position above 0.8 bearish, below 0.2 bullish |
confluence.signals.zscore | string | Mean reversion: above 1.5 bearish, below −1.5 bullish |
confluence.bullish_count | number | Bullish votes on the primary timeframe |
confluence.bearish_count | number | Bearish votes on the primary timeframe |
confluence.family_scores.trend_following | number | null | Vote share of rsi and trend alone |
confluence.family_scores.mean_reversion | number | null | Vote share of bollinger and zscore alone. The two families often disagree, which the combined score hides |
confluence.primary_timeframe | string | null | The first requested timeframe that computed; every top-level confluence field comes from it only |
confluence.per_timeframe.<tf> | object | The same score, bull_fraction, family_scores, bias, signals and counts for each computed timeframe |
confluence.aligned | boolean | true when at least two timeframes lean the same way and none leans the other, or all are neutral |
confluence.alignment_score | number | Share of timeframes leaning the common way; 0 when they disagree, 0.5 when all are neutral |
confluence.score_type | string | heuristic_vote_share |
confluence.validated | boolean | false: the score has no measured predictive value |
confluence.definition | string | The formula, as text |
| Field | Type | Description |
|---|---|---|
meta.offering | string | cerebrus_pulse |
meta.coins_available | number | How many markets the API covers |
meta.as_of.<input> | string | When each input was current: market_data (price and derivatives feed) and candles_<tf> (close of the newest closed candle) |
meta.warning | string | Optional. stale_data when the price feed is more than 15 minutes old |
meta.warnings | array | Optional. stale_candles when a timeframe’s candles stalled; the gateway adds stale_regime |
Example
Section titled “Example”GET /pulse/BTC?timeframes=1h,4h: real engine output on market data captured at 2026-09-24 17:05 UTC. Lists are cut to 3 items. Live responses may also carry meta.disclaimer, which the gateway adds.
{ "coin": "BTC", "market_symbol": "BTC", "price_unit": "1 BTC", "timestamp_iso": "2026-09-24T17:05:00Z", "price": { "current": 84512.5 }, "timeframes": { "1h": { "indicators": { "rsi_14": 49.16, "rsi_zone": "neutral", "atr_14": 495.286126, "atr_pct": 0.5881, "ema_20": 84134.27882, "ema_50": 84555.185241, "ema_200": 82476.178645, "vwap_20": 84001.13142, "zscore_100": -0.173, "bollinger": { "upper": 84796.137043, "middle": 84040.55, "lower": 83284.962957, "width_pct": 1.7981, "position_pct": 0.6194 }, "trend": { "direction": 1, "label": "weak_bullish", "ema_stack": "mixed" } }, "candle_freshness_seconds": 300.8, "last_closed_candle_time": "2026-09-24T17:00:00Z", "stale": false }, "4h": { "indicators": { "rsi_14": 47.17, "rsi_zone": "neutral", "atr_14": 727.64216, "atr_pct": 0.8715, "ema_20": 84338.703076, "ema_50": 82423.649073, "ema_200": 77957.991913, "vwap_20": 84859.417592, "zscore_100": 1.1847, "bollinger": { "upper": 87855.263546, "middle": 85270.85, "lower": 82686.436454, "width_pct": 6.0617, "position_pct": 0.1557 }, "trend": { "direction": 1, "label": "weak_bullish", "ema_stack": "mixed" } }, "candle_freshness_seconds": 3900.8, "last_closed_candle_time": "2026-09-24T16:00:00Z", "stale": false } }, "derivatives": { "funding_rate": 0.0000125, "funding_annualized_pct": 10.95, "funding_interval_hours": 1, "open_interest": 39370.3015, "impact_bid": 84485.4, "impact_ask": 84500, "impact_spread_bps": 1.73, "spread_bps": 1.73 }, "regime": { "current": "unknown", "as_of": 0 }, "confluence": { "score": 0.62, "bias": "bullish", "signals": { "rsi": "neutral", "trend": "bullish", "bollinger": "neutral", "zscore": "neutral" }, "bullish_count": 1, "bearish_count": 0, "per_timeframe": { "1h": { "score": 0.62, "bull_fraction": 0.625, "family_scores": { "trend_following": 0.75, "mean_reversion": 0.5 }, "bias": "bullish", "signals": { "rsi": "neutral", "trend": "bullish", "bollinger": "neutral", "zscore": "neutral" }, "bullish_count": 1, "bearish_count": 0 }, "4h": { "score": 0.75, "bull_fraction": 0.75, "family_scores": { "trend_following": 0.75, "mean_reversion": 0.75 }, "bias": "bullish", "signals": { "rsi": "neutral", "trend": "bullish", "bollinger": "bullish", "zscore": "neutral" }, "bullish_count": 2, "bearish_count": 0 } }, "aligned": true, "alignment_score": 1, "bull_fraction": 0.625, "family_scores": { "trend_following": 0.75, "mean_reversion": 0.5 }, "primary_timeframe": "1h", "score_type": "heuristic_vote_share", "validated": false, "definition": "score = bull_fraction = (bullish + 0.5*neutral) / votes on primary_timeframe; an unvalidated heuristic, not a confidence or probability" }, "meta": { "provider": "Cerebrus Pulse", "offering": "cerebrus_pulse", "execution_ms": 0, "coins_available": 51, "data_age_seconds": 60, "as_of": { "market_data": "2026-09-24T17:04:00Z", "candles_1h": "2026-09-24T17:00:00Z", "candles_4h": "2026-09-24T16:00:00Z" }, "sources": [ { "name": "Hyperliquid", "url": "https://hyperliquid.xyz" } ] }}Errors
Section titled “Errors”| Status | Reason |
|---|---|
| 400 | Unsupported timeframe (before any price is quoted), or no requested timeframe could be computed (not charged) |
| 402 | Payment required (the standard x402 flow) |
| 404 | Unknown coin (before any price is quoted) |
| 429 | Rate limit exceeded |
| 503 | Service disabled, payments down, or an upstream feed is missing or stale; no price is quoted |
| 504 | Engine timeout (not charged) |
Next Steps
Section titled “Next Steps”- GET /screener — Rank every market in one call before drilling into one
- Response Schemas — Units, enums and the common
metafields - Python SDK Guide and TypeScript SDK Guide — Paying from code