curl --request POST \
--url https://api.example.com/api/graph/v1/screener \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"technical": {
"trend_stack": true
},
"volume": {
"adv30_usd_min": 50000000
}
},
"include": {
"levels": true
},
"pagination": {
"limit": 50
},
"sort": {
"by": "dollar_volume",
"order": "desc"
}
}
'import requests
url = "https://api.example.com/api/graph/v1/screener"
payload = {
"filters": {
"technical": { "trend_stack": True },
"volume": { "adv30_usd_min": 50000000 }
},
"include": { "levels": True },
"pagination": { "limit": 50 },
"sort": {
"by": "dollar_volume",
"order": "desc"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
filters: {technical: {trend_stack: true}, volume: {adv30_usd_min: 50000000}},
include: {levels: true},
pagination: {limit: 50},
sort: {by: 'dollar_volume', order: 'desc'}
})
};
fetch('https://api.example.com/api/graph/v1/screener', 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/screener",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'filters' => [
'technical' => [
'trend_stack' => true
],
'volume' => [
'adv30_usd_min' => 50000000
]
],
'include' => [
'levels' => true
],
'pagination' => [
'limit' => 50
],
'sort' => [
'by' => 'dollar_volume',
'order' => 'desc'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/graph/v1/screener"
payload := strings.NewReader("{\n \"filters\": {\n \"technical\": {\n \"trend_stack\": true\n },\n \"volume\": {\n \"adv30_usd_min\": 50000000\n }\n },\n \"include\": {\n \"levels\": true\n },\n \"pagination\": {\n \"limit\": 50\n },\n \"sort\": {\n \"by\": \"dollar_volume\",\n \"order\": \"desc\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/graph/v1/screener")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"technical\": {\n \"trend_stack\": true\n },\n \"volume\": {\n \"adv30_usd_min\": 50000000\n }\n },\n \"include\": {\n \"levels\": true\n },\n \"pagination\": {\n \"limit\": 50\n },\n \"sort\": {\n \"by\": \"dollar_volume\",\n \"order\": \"desc\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/graph/v1/screener")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"filters\": {\n \"technical\": {\n \"trend_stack\": true\n },\n \"volume\": {\n \"adv30_usd_min\": 50000000\n }\n },\n \"include\": {\n \"levels\": true\n },\n \"pagination\": {\n \"limit\": 50\n },\n \"sort\": {\n \"by\": \"dollar_volume\",\n \"order\": \"desc\"\n }\n}"
response = http.request(request)
puts response.read_body{
"metadata": {
"data_freshness": "2025-12-20T15:30:00Z",
"filters_applied": [
"volume",
"technical"
],
"offset": 0,
"query_ms": 125.5,
"returned": 50,
"total_matched": 150
},
"stocks": [
{
"adv30_usd": 7500000000,
"dollar_volume": 8797500000,
"last_price": 195.5,
"symbol": "AAPL",
"updated_at": "2025-12-20T15:30:00Z",
"volume": 45000000
}
]
}Screen stocks using graph-native filters
Screen stocks using graph-native filters with optional relationship expansion.
Available Filters
- price: Min/max price range
- volume: ADV30 USD minimum, dollar volume minimum, relative volume
- technical: RSI range, trend stack alignment, compression patterns
- fundamental: Market cap range, sector, exchange
- options: IV percentile, open interest, put/call ratio (requires options pipeline)
- earnings: Days until earnings, earnings cleared (requires earnings pipeline)
- day_type: Filter by daily classification (trending, rotational, uncertain)
- patterns: Filter by active pattern types
- exclude_halted: Exclude halted stocks (default: true)
- symbols: Filter to specific symbols (max 50)
Include Options
Request additional relationship data:
- levels: IntradayLevel data (pivots, IB, CPR)
- volume_profile: VolumeProfileSession data (prior + developing)
- patterns: Pattern relationships
- news: NewsEvent summary
- day_classification: Full DayClassification data
Sorting
Sort by: dollar_volume, adv30_usd, market_cap, confluence_score, rsi_14, iv_percentile, rel_volume, bullish_confluence, bearish_confluence, net_confluence
Pagination
- limit: 1-200 (default: 50)
- offset: For pagination
Data Status Notes
Fields marked with x-data-status: pending in the schema require specific pipelines:
- Options fields require the options-collector pipeline
- Earnings fields require the earnings-sync pipeline
These filters will return empty results until the pipelines are active.
curl --request POST \
--url https://api.example.com/api/graph/v1/screener \
--header 'Content-Type: application/json' \
--data '
{
"filters": {
"technical": {
"trend_stack": true
},
"volume": {
"adv30_usd_min": 50000000
}
},
"include": {
"levels": true
},
"pagination": {
"limit": 50
},
"sort": {
"by": "dollar_volume",
"order": "desc"
}
}
'import requests
url = "https://api.example.com/api/graph/v1/screener"
payload = {
"filters": {
"technical": { "trend_stack": True },
"volume": { "adv30_usd_min": 50000000 }
},
"include": { "levels": True },
"pagination": { "limit": 50 },
"sort": {
"by": "dollar_volume",
"order": "desc"
}
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
filters: {technical: {trend_stack: true}, volume: {adv30_usd_min: 50000000}},
include: {levels: true},
pagination: {limit: 50},
sort: {by: 'dollar_volume', order: 'desc'}
})
};
fetch('https://api.example.com/api/graph/v1/screener', 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/screener",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'filters' => [
'technical' => [
'trend_stack' => true
],
'volume' => [
'adv30_usd_min' => 50000000
]
],
'include' => [
'levels' => true
],
'pagination' => [
'limit' => 50
],
'sort' => [
'by' => 'dollar_volume',
'order' => 'desc'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/graph/v1/screener"
payload := strings.NewReader("{\n \"filters\": {\n \"technical\": {\n \"trend_stack\": true\n },\n \"volume\": {\n \"adv30_usd_min\": 50000000\n }\n },\n \"include\": {\n \"levels\": true\n },\n \"pagination\": {\n \"limit\": 50\n },\n \"sort\": {\n \"by\": \"dollar_volume\",\n \"order\": \"desc\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/graph/v1/screener")
.header("Content-Type", "application/json")
.body("{\n \"filters\": {\n \"technical\": {\n \"trend_stack\": true\n },\n \"volume\": {\n \"adv30_usd_min\": 50000000\n }\n },\n \"include\": {\n \"levels\": true\n },\n \"pagination\": {\n \"limit\": 50\n },\n \"sort\": {\n \"by\": \"dollar_volume\",\n \"order\": \"desc\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/graph/v1/screener")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"filters\": {\n \"technical\": {\n \"trend_stack\": true\n },\n \"volume\": {\n \"adv30_usd_min\": 50000000\n }\n },\n \"include\": {\n \"levels\": true\n },\n \"pagination\": {\n \"limit\": 50\n },\n \"sort\": {\n \"by\": \"dollar_volume\",\n \"order\": \"desc\"\n }\n}"
response = http.request(request)
puts response.read_body{
"metadata": {
"data_freshness": "2025-12-20T15:30:00Z",
"filters_applied": [
"volume",
"technical"
],
"offset": 0,
"query_ms": 125.5,
"returned": 50,
"total_matched": 150
},
"stocks": [
{
"adv30_usd": 7500000000,
"dollar_volume": 8797500000,
"last_price": 195.5,
"symbol": "AAPL",
"updated_at": "2025-12-20T15:30:00Z",
"volume": 45000000
}
]
}Body
Screener request payload.
Screen stocks using graph-native filters with optional relationship expansion.
Example:
json { "filters": { "volume": {"adv30_usd_min": 50000000}, "technical": {"rsi_14": {"min": 30, "max": 70}} }, "include": {"levels": true, "patterns": true}, "sort": {"by": "dollar_volume", "order": "desc"}, "pagination": {"limit": 50} }
All available screener filters.
Show child attributes
Show child attributes
Options for including related data in response.
Show child attributes
Show child attributes
Sorting options.
Show child attributes
Show child attributes
Pagination options.
Show child attributes
Show child attributes
Response
Screener results
Screener response with results and metadata.
Show child attributes
Show child attributes
Metadata about screener query execution.
Show child attributes
Show child attributes
Market-data feed source label (entitlement layer): 'realtime_sip' | 'delayed' | 'byok'. Non-realtime_sip callers get 'delayed': the live overlay (VWAP/VWAP±σ/RSI/MACD + scores) is skipped and each stock's last_price is delayed to a clamped bar. Each stock also carries its own source label.