Volume Delta
Category: Price & market data · Updated November 2026
The TAAPI.IO Volume Delta API returns the real buy and sell volume of each candle, the difference between them (the volume delta) and its running total, the cumulative volume delta (CVD). The numbers come from the exchange's own record of which side started each trade, not from the shape of the candle. It is available for Binance and Binance Futures.
Real order flow, two exchanges. Binance and Binance Futures report for every candle how much was bought with market orders. Other exchanges don't send that with their candles, so this endpoint returns an error there. For an estimate that works everywhere, use Volume Split.
| Spec | Value |
|---|---|
| Endpoint | GET https://v2.taapi.io/indicator/volumedelta |
| Outputs | buyVolume, sellVolume, delta, deltaPercent, cvd, anchor |
| Markets | Binance and Binance Futures (USDT-M) |
| Timeframes | 1m to 1w |
| Delivery | REST, bulk and WebSocket |
Get Volume Delta with one API call
This request returns Volume Delta for BTCUSDT on 1-hour Binance candles. Add your API key to run it here.
curl -G https://v2.taapi.io/indicator/volumedelta \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "exchange=binance" \ --data-urlencode "symbol=BTCUSDT" \ --data-urlencode "timeframe=1h"
import requests
resp = requests.get(
'https://v2.taapi.io/indicator/volumedelta',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={'exchange': 'binance', 'symbol': 'BTCUSDT', 'timeframe': '1h'},
)
print(resp.json())const params = new URLSearchParams({"exchange": "binance", "symbol": "BTCUSDT", "timeframe": "1h"});
const res = await fetch(`https://v2.taapi.io/indicator/volumedelta?${params}`, {
headers: { Authorization: 'Bearer YOUR_API_KEY' },
});
console.log(await res.json());Volume Delta API response
Live output for Binance BTCUSDT 1-hour candles on 13 November 2026, 19 minutes into the 09:00 UTC candle. Sellers had the upper hand in that candle so far (delta −80 BTC, −17%), but the CVD still shows about 1,300 BTC more bought than sold since the week started on Monday.
{
"buyVolume": [190.58146],
"sellVolume": [270.2875000000001],
"delta": [-79.70604000000009],
"deltaPercent": [-17.294729504022158],
"cvd": [1316.83447],
"anchor": "week",
"timestamp": [1794560400]
}| Field | Type | Description |
|---|---|---|
buyVolume | number[] | Volume bought with market orders (takers buying from the order book), in the base asset, e.g. BTC. |
sellVolume | number[] | Volume sold with market orders: the candle's volume − buyVolume. |
delta | number[] | buyVolume − sellVolume. Positive when aggressive buying outweighed aggressive selling. |
deltaPercent | number[] | delta as a percentage of the candle's volume, from −100 to 100. 0 when the candle has no volume. |
cvd | number[] | Cumulative volume delta: the sum of delta since the start of the current anchor period. null before the first anchor in the data (see anchor). |
anchor | string | The period the CVD restarts on: hour, day, week, month, year or none. |
timestamp | integer[] | Unix time of each candle, in seconds. |
Volume Delta API parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
exchange | string | Yes | — | binance or binancefutures |
symbol | string | Yes | — | Pair, e.g. BTCUSDT |
timeframe | string | Yes | — | 1m 5m 15m 1h 4h 1d 1w |
anchor | string | No | auto | Where the CVD restarts at 0, in UTC: hour, day, week (Monday 00:00), month, year or none. auto picks one for the timeframe (see below). |
results | integer | No | 1 | Number of values to return, or max |
backtrack | integer | No | 0 | Candles to skip from the most recent |
What is Volume Delta?
Every trade has two sides: a resting order waiting in the order book and an order that crossed the spread to fill it right away (the taker). When the taker is a buyer, the trade counts as buy volume; when the taker is a seller, as sell volume. Volume delta is buy volume minus sell volume. A positive delta means buyers were the ones in a hurry during that candle; a negative delta means sellers were.
The cumulative volume delta adds those deltas up over time. Traders compare it with price: a CVD rising with price confirms the move, while a CVD that disagrees with price shows that one side's market orders are being absorbed by resting orders on the other side.
Volume Delta formula
| Output | Calculation |
|---|---|
buyVolume | taker buy volume reported by the exchange for the candle |
sellVolume | volume − buyVolume |
delta | buyVolume − sellVolume = 2 × buyVolume − volume |
deltaPercent | delta ÷ volume × 100 |
cvd | running sum of delta, reset to 0 at the start of each anchor period |
Example: a 1-hour candle traded 500 BTC, of which 320 BTC were bought with market orders. buyVolume = 320, sellVolume = 180, delta = 140 and deltaPercent = 28.
How the CVD anchor works
The CVD has to start counting somewhere. With an anchor it restarts at 0 at the start of every hour, day, week, month or year (UTC), so the same candle always gets the same value. The default, auto, picks an anchor that fits several periods into the roughly 300 candles the API looks at:
| Timeframe | anchor=auto uses |
|---|---|
1m | hour |
5m, 15m | day |
1h, 4h | week |
1d | month |
1w | year |
Candles before the first anchor in the data get cvd = null, because the start of their period isn't in the data. With anchor=none the CVD instead adds up from the first candle the API fetched. Its level then depends on that window and moves as new candles arrive, so only its changes mean anything.
Volume Delta vs Volume Split
Volume Split estimates buy and sell volume from where a candle closed inside its range. It works on every market, but it is only an estimate. Volume Delta uses the exchange's real taker volume. On the BTCUSDT 1-hour candles of 12 November 2026 (00:00–15:59 UTC), 49.4% of the 10,864 BTC traded was bought with market orders, while the close-location estimate said 44.9%. Over 12,000 Binance candles the estimate picked the right side (more buying or more selling) only 59–68% of the time. On Binance and Binance Futures, Volume Split now uses the real taker volume too: its method field says taker.
How to read Volume Delta in your code
| Signal | Meaning | Condition |
|---|---|---|
| Confirmed move | Market orders push in the direction of price | Price and cvd both rising (or both falling) over the same candles |
| Absorption | Aggressive buyers (or sellers) are not moving price: resting orders on the other side soak them up | cvd rising while price is flat or falling, or the reverse |
| One-sided candle | A candle dominated by one side's market orders | deltaPercent above about 20 or below about −20 on a liquid pair |
| Exhaustion | A strong move on shrinking aggression | Price makes a new high while the delta of each push gets smaller |
Worked example (BTCUSDT 1h, 12 November 2026, anchor=day): from 06:00 to 10:59 UTC buyers took 59% of the volume and the day's CVD rose by 275 BTC, yet price slipped from 73,586 to 73,464. Market buying was being absorbed. From 11:00 to 14:59 the delta turned to −504 BTC and price fell 2.5% to 71,646. The divergence came first; it did not say how far price would fall, and many divergences resolve without a move.
Limitations: Volume Delta is only available where the exchange reports taker volume per candle: Binance and Binance Futures. It describes who was aggressive, not who will win: resting limit orders can absorb any amount of market buying. The candle still forming changes until it closes. Large players split orders and use limit orders, so the delta misses much of their activity. History is limited to the last 3,000 candles per timeframe, so 1m covers about two days. A candle without taker data returns null. Nothing on this page is financial advice.
Track today's CVD on closed candles
Return the last 24 closed hourly candles with the CVD restarting at 00:00 UTC. backtrack=1 skips the candle still forming.
curl -G https://v2.taapi.io/indicator/volumedelta \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "exchange=binance" \ --data-urlencode "symbol=BTCUSDT" \ --data-urlencode "timeframe=1h" \ --data-urlencode "anchor=day" \ --data-urlencode "results=24" \ --data-urlencode "backtrack=1"
import requests
resp = requests.get(
'https://v2.taapi.io/indicator/volumedelta',
headers={'Authorization': 'Bearer YOUR_API_KEY'},
params={'exchange': 'binance', 'symbol': 'BTCUSDT', 'timeframe': '1h', 'anchor': 'day', 'results': 24, 'backtrack': 1},
)
data = resp.json()
cvd, delta = data['cvd'], data['delta']
print(f"CVD since 00:00 UTC: {cvd[-1]:+.1f} BTC")
strongest = max(range(len(delta)), key=lambda i: abs(delta[i]))
print(f"Most one-sided closed hour: {delta[strongest]:+.1f} BTC at {data['timestamp'][strongest]}")Get historical Volume Delta values
Add results to return a series for backtesting or charting. The last element is the most recent candle. This request returns the last 24 hours of 15-minute ETHUSDT perpetual futures candles.
curl -G https://v2.taapi.io/indicator/volumedelta \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "exchange=binancefutures" \ --data-urlencode "symbol=ETHUSDT" \ --data-urlencode "timeframe=15m" \ --data-urlencode "results=96"
Get Volume Delta for multiple symbols
Combine Volume Delta with other indicators in one request. Each exchange, symbol and timeframe combination is one construct: Basic allows 1 per request, Pro 3 and Expert 10.
curl -X POST https://v2.taapi.io/bulk \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"constructs": [
{
"id": "btc_1h",
"exchange": "binance",
"symbol": "BTCUSDT",
"timeframe": "1h",
"indicators": [
{
"id": "volumedelta",
"indicator": "volumedelta",
"anchor": "day"
},
{
"id": "vwap",
"indicator": "vwap"
}
]
}
]
}'Stream Volume Delta in real time
Subscribe over WebSocket to receive new values every 5 seconds while the candle is forming. Streaming supports 1m, 5m, 15m and 1h, and uses interval where REST uses timeframe.
{
"type": "subscribe",
"id": "volumedelta",
"exchange": "binancefutures",
"symbol": "BTCUSDT",
"interval": "1m",
"indicator": "volumedelta"
}Volume Delta API FAQ
What does the Volume Delta API return?
Per candle: buyVolume, sellVolume, delta, deltaPercent and cvd, plus timestamp, and the anchor the CVD used.
Which exchanges support Volume Delta?
Binance (binance) and Binance Futures (binancefutures), which report taker buy volume with every candle. Bybit, Gate.io, Kraken and US stocks don't, so the endpoint returns an error there; use Volume Split for an estimate.
Is this real buy and sell volume?
Yes. It is the exchange's own count of volume bought and sold with market orders, not an estimate from the candle shape.
Why is cvd null for the first candles?
With an anchor, the CVD restarts at the start of each period. For candles before the first period start in the data, the starting point is unknown, so they get null. Use anchor=none to sum from the first fetched candle instead.
Is the latest Volume Delta value final?
No. The newest value belongs to the candle still forming and changes until it closes. Add backtrack=1 to read the last closed candle.
Related indicators
See the full list of indicators, or start for free.