Skip to content

CVD — Cumulative Volume Delta

GET /cvd/:symbol

Real-time Cumulative Volume Delta aggregated from Binance, OKX, Bybit, and Kraken WebSocket trade streams.

Cost: $0.02 USDC

What is CVD?

CVD measures the cumulative difference between market buy volume and market sell volume. It reveals the true direction of aggressive order flow:

  • Positive CVD = more market buys than sells → buying pressure dominant
  • Negative CVD = more market sells than buys → selling pressure dominant
  • Divergence = price rising but CVD falling → weak rally, possible reversal

Path Parameters

ParamTypeDescription
symbolstringToken symbol, uppercase (e.g. BTC, ETH, SOL)

Query Parameters

ParamTypeDefaultOptions
periodstring1h1h, 4h, 24h, 7d

Request Example

bash
curl -H "x-payment: <proof>" \
  "https://api.foursec.xyz/cvd/ETH?period=1h"
javascript
const res = await fetchWithPayment(
  "https://api.foursec.xyz/cvd/ETH?period=1h"
);
const data = await res.json();
console.log(`ETH CVD signal: ${data.signal}`);

Response

json
{
  "symbol": "ETH",
  "cvd": 48250000,
  "period_cvd": 3200000,
  "buy_volume": 48000000,
  "sell_volume": 44800000,
  "signal": "bullish_pressure",
  "period": "1h",
  "active_ws_connections": 4,
  "exchanges": {
    "binance": {
      "cvd": 28000000,
      "buy_volume": 32000000,
      "sell_volume": 4000000
    },
    "okx": {
      "cvd": 12500000,
      "buy_volume": 16000000,
      "sell_volume": 3500000
    },
    "bybit": {
      "cvd": 6000000,
      "buy_volume": 8000000,
      "sell_volume": 2000000
    },
    "kraken": {
      "cvd": 1750000,
      "buy_volume": 2000000,
      "sell_volume": 250000
    }
  },
  "timestamp": "2026-07-09T10:30:00Z",
  "cached": false
}

Signal Values

SignalConditionInterpretation
strong_bullish_pressurePeriod CVD > 15% of total volumeStrong net buying
bullish_pressurePeriod CVD 5–15% of total volumeModerate net buying
neutralPeriod CVD within ±5% of total volumeBalanced flow
bearish_pressurePeriod CVD -5% to -15% of total volumeModerate net selling
strong_bearish_pressurePeriod CVD < -15% of total volumeStrong net selling
insufficient_dataNo trades in periodStream warming up

Warming Up

When requesting a symbol for the first time, the API returns a warming_up status while WebSocket connections establish. Retry after 10 seconds:

json
{
  "symbol": "LINK",
  "status": "warming_up",
  "message": "CVD stream started for LINK. Data available in ~10 seconds."
}

Default pre-subscribed symbols (always ready): BTC, ETH, SOL, XRP, BNB, DOGE, LINK, ARB

Data Sources

ExchangeStreamType
Binancewss://stream.binance.com/ws/{symbol}usdt@aggTradeWebSocket
OKXwss://ws.okx.com:8443/ws/v5/publictradesWebSocket
Bybitwss://stream.bybit.com/v5/public/spotpublicTradeWebSocket
Krakenwss://ws.kraken.comtradeWebSocket
CCXT RESTBinance/OKX REST fallbackREST (gap fill)

Cache TTL: 5 seconds.

Use Case: Divergence Detection

javascript
// Detect price/CVD divergence (weak rally warning)
const [price, cvd] = await Promise.all([
  fetchWithPayment("https://api.foursec.xyz/price/ETH"),
  fetchWithPayment("https://api.foursec.xyz/cvd/ETH?period=4h"),
]);
const priceData = await price.json();
const cvdData = await cvd.json();

const priceUp = priceData.price_change_4h > 0;
const cvdNegative = cvdData.period_cvd < 0;

if (priceUp && cvdNegative) {
  console.log("WARNING: Price rising but CVD negative — potential weak rally");
}

Built with x402 protocol on Base