Get volume nodes for symbol
curl --request GET \
--url https://api.example.com/api/graph/v1/volume-nodes/{symbol}import requests
url = "https://api.example.com/api/graph/v1/volume-nodes/{symbol}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/api/graph/v1/volume-nodes/{symbol}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/graph/v1/volume-nodes/{symbol}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/graph/v1/volume-nodes/{symbol}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/api/graph/v1/volume-nodes/{symbol}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/graph/v1/volume-nodes/{symbol}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"symbol": "<string>",
"trade_date": "2023-12-25",
"session_type": "<string>",
"hvn_count": 123,
"lvn_count": 123,
"nodes": [
{
"symbol": "<string>",
"trade_date": "2023-12-25",
"node_type": "HVN",
"price_low": "<string>",
"price_high": "<string>",
"price_mid": "<string>",
"node_volume": 123,
"bucket_count": 123,
"z_score": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_type": "prior",
"node_volume_pct": "<string>",
"avg_bucket_volume": 123,
"node_rank": 123,
"overlaps_value_area": false,
"contains_poc": false,
"computed_at": "2023-11-07T05:31:56Z"
}
],
"context": {
"symbol": "<string>",
"trade_date": "2023-12-25",
"session_type": "<string>",
"poc": "<string>",
"vah": "<string>",
"val": "<string>",
"profile_shape": "<string>",
"hvn_nodes": [
{
"symbol": "<string>",
"trade_date": "2023-12-25",
"node_type": "HVN",
"price_low": "<string>",
"price_high": "<string>",
"price_mid": "<string>",
"node_volume": 123,
"bucket_count": 123,
"z_score": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_type": "prior",
"node_volume_pct": "<string>",
"avg_bucket_volume": 123,
"node_rank": 123,
"overlaps_value_area": false,
"contains_poc": false,
"computed_at": "2023-11-07T05:31:56Z"
}
],
"lvn_nodes": [
{
"symbol": "<string>",
"trade_date": "2023-12-25",
"node_type": "HVN",
"price_low": "<string>",
"price_high": "<string>",
"price_mid": "<string>",
"node_volume": 123,
"bucket_count": 123,
"z_score": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_type": "prior",
"node_volume_pct": "<string>",
"avg_bucket_volume": 123,
"node_rank": 123,
"overlaps_value_area": false,
"contains_poc": false,
"computed_at": "2023-11-07T05:31:56Z"
}
],
"hvn_count": 0,
"lvn_count": 0,
"strongest_hvn": {
"symbol": "<string>",
"trade_date": "2023-12-25",
"node_type": "HVN",
"price_low": "<string>",
"price_high": "<string>",
"price_mid": "<string>",
"node_volume": 123,
"bucket_count": 123,
"z_score": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_type": "prior",
"node_volume_pct": "<string>",
"avg_bucket_volume": 123,
"node_rank": 123,
"overlaps_value_area": false,
"contains_poc": false,
"computed_at": "2023-11-07T05:31:56Z"
},
"strongest_lvn": {
"symbol": "<string>",
"trade_date": "2023-12-25",
"node_type": "HVN",
"price_low": "<string>",
"price_high": "<string>",
"price_mid": "<string>",
"node_volume": 123,
"bucket_count": 123,
"z_score": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_type": "prior",
"node_volume_pct": "<string>",
"avg_bucket_volume": 123,
"node_rank": 123,
"overlaps_value_area": false,
"contains_poc": false,
"computed_at": "2023-11-07T05:31:56Z"
}
},
"hvn_threshold": "1.0",
"lvn_threshold": "-1.0",
"min_buckets": 2
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Volume Nodes
Get volume nodes for symbol
Detect and return volume nodes (HVN/LVN) for a symbol.
## Node Types
- **HVN (High Volume Node)**: Areas of price acceptance/consolidation (support/resistance)
- Price tends to consolidate at these levels
- Detected when bucket volume exceeds `hvn_threshold` standard deviations above mean
- **LVN (Low Volume Node)**: Areas of price rejection (breakout/breakdown zones)
- Price tends to move quickly through these levels
- Detected when bucket volume falls below `lvn_threshold` standard deviations below mean
## Detection Algorithm
1. Fetch volume buckets from `volume_by_price_bucket` table
2. Calculate mean and standard deviation of bucket volumes
3. Classify buckets as HVN (>hvn_threshold σ) or LVN (<lvn_threshold σ)
4. Cluster contiguous buckets into nodes
5. Filter nodes with at least `min_buckets` contiguous buckets
6. Rank nodes by total volume
## Session Types
- **prior**: Previous day's completed volume profile (default)
- **developing**: Current day's intraday volume profile
## Performance
Prior session nodes may be cached in `volume_nodes` table for faster retrieval.
Developing session nodes are always computed on-demand.
## Performance Target
<200ms response time.
GET
/
api
/
graph
/
v1
/
volume-nodes
/
{symbol}
Get volume nodes for symbol
curl --request GET \
--url https://api.example.com/api/graph/v1/volume-nodes/{symbol}import requests
url = "https://api.example.com/api/graph/v1/volume-nodes/{symbol}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.example.com/api/graph/v1/volume-nodes/{symbol}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/graph/v1/volume-nodes/{symbol}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/graph/v1/volume-nodes/{symbol}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.example.com/api/graph/v1/volume-nodes/{symbol}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/graph/v1/volume-nodes/{symbol}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"symbol": "<string>",
"trade_date": "2023-12-25",
"session_type": "<string>",
"hvn_count": 123,
"lvn_count": 123,
"nodes": [
{
"symbol": "<string>",
"trade_date": "2023-12-25",
"node_type": "HVN",
"price_low": "<string>",
"price_high": "<string>",
"price_mid": "<string>",
"node_volume": 123,
"bucket_count": 123,
"z_score": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_type": "prior",
"node_volume_pct": "<string>",
"avg_bucket_volume": 123,
"node_rank": 123,
"overlaps_value_area": false,
"contains_poc": false,
"computed_at": "2023-11-07T05:31:56Z"
}
],
"context": {
"symbol": "<string>",
"trade_date": "2023-12-25",
"session_type": "<string>",
"poc": "<string>",
"vah": "<string>",
"val": "<string>",
"profile_shape": "<string>",
"hvn_nodes": [
{
"symbol": "<string>",
"trade_date": "2023-12-25",
"node_type": "HVN",
"price_low": "<string>",
"price_high": "<string>",
"price_mid": "<string>",
"node_volume": 123,
"bucket_count": 123,
"z_score": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_type": "prior",
"node_volume_pct": "<string>",
"avg_bucket_volume": 123,
"node_rank": 123,
"overlaps_value_area": false,
"contains_poc": false,
"computed_at": "2023-11-07T05:31:56Z"
}
],
"lvn_nodes": [
{
"symbol": "<string>",
"trade_date": "2023-12-25",
"node_type": "HVN",
"price_low": "<string>",
"price_high": "<string>",
"price_mid": "<string>",
"node_volume": 123,
"bucket_count": 123,
"z_score": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_type": "prior",
"node_volume_pct": "<string>",
"avg_bucket_volume": 123,
"node_rank": 123,
"overlaps_value_area": false,
"contains_poc": false,
"computed_at": "2023-11-07T05:31:56Z"
}
],
"hvn_count": 0,
"lvn_count": 0,
"strongest_hvn": {
"symbol": "<string>",
"trade_date": "2023-12-25",
"node_type": "HVN",
"price_low": "<string>",
"price_high": "<string>",
"price_mid": "<string>",
"node_volume": 123,
"bucket_count": 123,
"z_score": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_type": "prior",
"node_volume_pct": "<string>",
"avg_bucket_volume": 123,
"node_rank": 123,
"overlaps_value_area": false,
"contains_poc": false,
"computed_at": "2023-11-07T05:31:56Z"
},
"strongest_lvn": {
"symbol": "<string>",
"trade_date": "2023-12-25",
"node_type": "HVN",
"price_low": "<string>",
"price_high": "<string>",
"price_mid": "<string>",
"node_volume": 123,
"bucket_count": 123,
"z_score": "<string>",
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"session_type": "prior",
"node_volume_pct": "<string>",
"avg_bucket_volume": 123,
"node_rank": 123,
"overlaps_value_area": false,
"contains_poc": false,
"computed_at": "2023-11-07T05:31:56Z"
}
},
"hvn_threshold": "1.0",
"lvn_threshold": "-1.0",
"min_buckets": 2
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Path Parameters
Query Parameters
Date (defaults to most recent with data)
Session type: prior or developing
Sigma above mean for HVN classification
Required range:
0 <= x <= 3Sigma below mean for LVN classification
Required range:
-3 <= x <= 0Minimum contiguous buckets for a valid node
Required range:
1 <= x <= 10Response
Volume nodes detected
Response for volume nodes query.
Number of HVN nodes
Number of LVN nodes
All detected volume nodes
Show child attributes
Show child attributes
Optional full context with profile data
Show child attributes
Show child attributes
Pattern:
^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$Pattern:
^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$