---
title: Volume Profile (WebSocket)
description: Real-time volume profile aggregated from live trades via WebSocket.
---

# Volume Profile (WebSocket)

<div class="type-header">
<span class="type-tag">VOLUME_PROFILE_AGG</span>
</div>

Subscribe to real-time volume profiles built from live trade data. The server aggregates trades into price buckets and streams updated profiles at a configurable frequency. Block size is determined automatically based on the instrument's price.

## Type-specific parameters

These parameters are in addition to the common channel parameters.

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `groupByType` | string | No | Set to `"1"` to aggregate across symbols for the same coin. When enabled, keep using `symbol`, but pass the coin identifier (for example `BTC`). Default: `"0"` (per-symbol). |
| `updateFrequency` | string | No | Minimum time between updates (e.g., `100ms`, `500ms`, `1s`). |

<Callout kind="tip">

Like the REST API, you do not need to specify `blockSize` for volume profile -- it is calculated server-side from the instrument's price metadata.

</Callout>

## Subscribe

### Per-symbol (single exchange)

<CodeBlock lang="JSON">
<pre>{
  <span class="s-p">"jsonrpc"</span>: <span class="s-s">"2.0"</span>,
  <span class="s-p">"id"</span>: <span class="s-n">0</span>,
  <span class="s-p">"method"</span>: <span class="s-s">"public/subscribe"</span>,
  <span class="s-p">"params"</span>: {
    <span class="s-p">"channels"</span>: [
      {
        <span class="s-p">"type"</span>: <span class="s-s">"VOLUME_PROFILE_AGG"</span>,
        <span class="s-p">"category"</span>: <span class="s-s">"*"</span>,
        <span class="s-p">"exchange"</span>: <span class="s-s">"BINANCE_FUTURES"</span>,
        <span class="s-p">"symbol"</span>: <span class="s-s">"BTCUSDT"</span>,
        <span class="s-p">"quote"</span>: <span class="s-s">"USD"</span>
      }
    ],
    <span class="s-p">"compression"</span>: <span class="s-s">"brotli"</span>,
    <span class="s-p">"version"</span>: <span class="s-s">"v2"</span>
  }
}</pre>
</CodeBlock>

### Coin-aggregated (multi-exchange)

Set `groupByType` to `"1"` to aggregate volume across all symbols for the same coin. For this mode, keep the `symbol` field and pass the coin identifier, for example `BTC`. Only spot and perpetual markets with USD-quoted pairs are included in the aggregation.

<CodeBlock lang="JSON">
<pre>{
  <span class="s-p">"jsonrpc"</span>: <span class="s-s">"2.0"</span>,
  <span class="s-p">"id"</span>: <span class="s-n">1</span>,
  <span class="s-p">"method"</span>: <span class="s-s">"public/subscribe"</span>,
  <span class="s-p">"params"</span>: {
    <span class="s-p">"channels"</span>: [
      {
        <span class="s-p">"type"</span>: <span class="s-s">"VOLUME_PROFILE_AGG"</span>,
        <span class="s-p">"category"</span>: <span class="s-s">"*"</span>,
        <span class="s-p">"exchange"</span>: <span class="s-s">"BINANCE_FUTURES"</span>,
        <span class="s-p">"symbol"</span>: <span class="s-s">"BTC"</span>,
        <span class="s-p">"quote"</span>: <span class="s-s">"USD"</span>,
        <span class="s-p">"groupByType"</span>: <span class="s-s">"1"</span>
      }
    ],
    <span class="s-p">"compression"</span>: <span class="s-s">"brotli"</span>,
    <span class="s-p">"version"</span>: <span class="s-s">"v2"</span>
  }
}</pre>
</CodeBlock>

## Response

<CodeBlock lang="JSON">
<pre>{
  <span class="s-p">"points"</span>: [
    {
      <span class="s-p">"series"</span>: {
        <span class="s-p">"type"</span>: <span class="s-s">"VOLUME_PROFILE_AGG"</span>,
        <span class="s-p">"symbol"</span>: <span class="s-s">"BTCUSDT"</span>,
        <span class="s-p">"exchange"</span>: <span class="s-s">"BINANCE_FUTURES"</span>,
        <span class="s-p">"coin"</span>: <span class="s-s">"BTC"</span>,
        <span class="s-p">"category"</span>: <span class="s-s">"PERPETUAL"</span>,
        <span class="s-p">"blockSize"</span>: <span class="s-n">25</span>
      },
      <span class="s-p">"volumeProfileAggregation"</span>: {
        <span class="s-p">"profile"</span>: [
          <span class="s-n">89950</span>, <span class="s-n">1.25</span>, <span class="s-n">0.87</span>,
          <span class="s-n">89975</span>, <span class="s-n">3.41</span>, <span class="s-n">2.15</span>,
          <span class="s-n">90000</span>, <span class="s-n">5.67</span>, <span class="s-n">4.32</span>,
          <span class="s-n">90025</span>, <span class="s-n">2.89</span>, <span class="s-n">3.01</span>,
          <span class="s-n">90050</span>, <span class="s-n">1.54</span>, <span class="s-n">0.92</span>
        ],
        <span class="s-p">"timestamp"</span>: {
          <span class="s-p">"seconds"</span>: <span class="s-n">1769058600</span>
        }
      }
    }
  ]
}</pre>
</CodeBlock>

For grouped subscriptions, the live BTC stream returned `series.symbol = "BTC"` and `series.coin = "BTC"`. `series.groupByType` was not present in the response.

### Response fields

| Field | Type | Description |
| --- | --- | --- |
| `series.symbol` | string | Exchange-native raw symbol for per-symbol subscriptions. Grouped subscriptions use the coin identifier, such as `BTC`. |
| `series.coin` | string | Coin identifier for the stream |
| `series.blockSize` | double | Price bucket size, determined automatically by the server |
| `volumeProfileAggregation.profile` | double[] | Flat array of `[price, buyVolume, sellVolume, ...]` triplets, sorted ascending by price |
| `volumeProfileAggregation.timestamp` | Timestamp | End of the aggregation interval |