curl --request POST \
--url https://api.example.com/api/graph/v1/options/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/options/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/options/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/options/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/options/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/options/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/options/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 with options-centric defaults
curl --request POST \
--url https://api.example.com/api/graph/v1/options/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/options/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/options/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/options/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/options/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/options/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/options/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
Options 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.