BTC Pulse API

4-factor composite model — REST API

Overview

BTC Pulse provides a free, public API that returns the 4-factor composite score for Bitcoin's macro direction. The model blends Macro Liquidity, Halving Cycle, Price Trend, and Market Sentiment into a single 0–100 score.

Base URL: https://btcpulse.vercel.app
Rate Limit: Responses are cached for 5 minutes. No API key required.
CORS: Enabled for all origins.

Endpoint

GET /api/pulse

Returns the latest composite score, signal, factor breakdown, and optional historical data.

Query Parameters

ParamTypeDefaultDescription
daysint | "max"120Number of days of history. Max 3650, or "max" for all available data.
history"true" | "false""true"Set to "false" to return only the latest score (faster response).

Response (latest only)

GET /api/pulse?days=120&history=false
{
  "score": 55,
  "signal": "NEUTRAL",
  "price": 96432,
  "date": "2026-05-02",
  "factors": {
    "macro": 12.5,
    "cycle": 15.0,
    "trend": 18.3,
    "sentiment": 11.2,
    "base": 5
  },
  "model": "v2",
  "weights": "Macro(25)+Cycle(25)+Trend(25)+Sentiment(20)+Base(5)=100"
}

Response (with history)

GET /api/pulse?days=7
{
  "score": 55,
  "signal": "NEUTRAL",
  "price": 96432,
  "date": "2026-05-02",
  "factors": { ... },
  "model": "v2",
  "weights": "...",
  "history": [
    { "date": "2026-04-26", "price": 94102, "score": 57, "signal": "NEUTRAL" },
    { "date": "2026-04-27", "price": 94800, "score": 56, "signal": "NEUTRAL" },
    ...
  ]
}

Response Fields

FieldTypeDescription
scoreintComposite score 0–100 (EMA smoothed)
signalstringOne of: STRONG_BUY, BUY, NEUTRAL, CAUTION, RISK_OFF
pricefloatLatest BTC close price (USD)
datestringDate of the latest data point (YYYY-MM-DD)
factorsobjectBreakdown of the 4 factor scores + base
factors.macrofloatMacro Liquidity score (0–25)
factors.cyclefloatHalving Cycle score (5–25)
factors.trendfloatPrice Trend score (0–25, with overheating penalty)
factors.sentimentfloatMarket Sentiment score (4–20, contrarian mapping)
factors.baseintBase score (always 5)
modelstringModel version identifier
historyarrayDaily score history (omitted when history=false)

Signal Levels

ScoreSignalInterpretation
80–100STRONG_BUYAll factors aligned bullish
60–80BUYMost factors bullish
40–60NEUTRALMixed signals, direction unclear
20–40CAUTIONMost factors bearish
0–20RISK_OFFAll factors aligned bearish

Examples

cURL

curl "https://btcpulse.vercel.app/api/pulse?days=30&history=false"

JavaScript (fetch)

const res = await fetch("https://btcpulse.vercel.app/api/pulse?days=30");
const data = await res.json();
console.log(`BTC Score: ${data.score} — ${data.signal}`);

Python (requests)

import requests

r = requests.get("https://btcpulse.vercel.app/api/pulse", params={"days": 30, "history": "false"})
data = r.json()
print(f"BTC Score: {data['score']} — {data['signal']}")

Try It

Click to fetch the latest score from the API:

Model (v2)

Score = Macro(25) + Cycle(25) + Trend(25) + Sentiment(20) + Base(5) = 0~100
FactorMaxSourceMethod
Macro Liquidity25FRED (M2SL, DGS10, DTWEXBGS)Z-score blend: 60% absolute + 40% rate-of-change
Halving Cycle25Hardcoded datesDeterministic curve: peak 6–18mo post-halving
Price Trend25CryptoComparePrice/200DMA ratio with overheating penalty >1.5x
Sentiment20Alternative.me FNGNon-linear contrarian mapping
Base5Constant to prevent zero-floor edge cases

Final score is smoothed with EMA (k=0.1, ~20-day effective window) to reduce daily noise.

⚠️ Disclaimer: This API is provided for informational purposes only. It is not financial advice. Cryptocurrency is highly volatile — use at your own risk.