curl --request POST \
--url https://api.example.com/api/graph/v1/debate/{symbol}import requests
url = "https://api.example.com/api/graph/v1/debate/{symbol}"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.example.com/api/graph/v1/debate/{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/debate/{symbol}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$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/debate/{symbol}"
req, _ := http.NewRequest("POST", url, nil)
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/debate/{symbol}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/graph/v1/debate/{symbol}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"bear_thesis": {
"confidence": 58,
"headline": "Extended valuation and earnings risk",
"strength": "MODERATE",
"symbol": "NVDA"
},
"bull_thesis": {
"confidence": 72,
"headline": "Strong momentum with volume confirmation",
"strength": "STRONG",
"symbol": "NVDA"
},
"request": {
"include_historical": true,
"risk_appetite": "moderate",
"symbol": "NVDA",
"timeframe": "swing",
"verbose": false
},
"symbol": "NVDA",
"timestamp": "2026-01-29T10:30:00Z",
"verdict": {
"confidence": 65,
"deciding_factors": [
"Technical momentum outweighs valuation concern",
"FPT suggests favorable timing"
],
"key_risk": "Earnings in 2 weeks",
"timing_recommendation": "Enter on pullback to support",
"verdict": "BUY"
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Run investment thesis debate
Run a complete Bull/Bear/Arbiter debate for a stock symbol.
Debate System Overview
The debate system uses three specialized AI agents:
-
Bull Agent (Inductive Reasoning)
- Builds bullish thesis from evidence patterns
- Identifies catalysts and upside targets
- Searches for similar historical wins
-
Bear Agent (Inversion Reasoning)
- Challenges bull thesis assumptions
- Identifies risks and weaknesses
- Searches for similar historical losses
-
Arbiter (Dialectical Synthesis)
- Weighs opposing arguments objectively
- Integrates FPT timing analysis
- Renders actionable verdict
Request Parameters
- symbol: Stock ticker (path parameter)
- timeframe: Trading timeframe (day, swing, position, investment)
- risk_appetite: Risk tolerance (conservative, moderate, aggressive)
- include_historical: Search Qdrant for historical analogs
- verbose: Include full agent narratives
Response
Complete debate results including:
- Bull thesis with catalysts and evidence
- Bear counter-thesis with risks
- Arbiter verdict with timing recommendation
- Position sizing guidance
Performance
Typical response time: 15-30 seconds (3 LLM calls + vector search)
LLM Models Used
- Bull/Bear: Claude Sonnet (fast, focused reasoning)
- Arbiter: Claude Opus (complex synthesis)
curl --request POST \
--url https://api.example.com/api/graph/v1/debate/{symbol}import requests
url = "https://api.example.com/api/graph/v1/debate/{symbol}"
response = requests.post(url)
print(response.text)const options = {method: 'POST'};
fetch('https://api.example.com/api/graph/v1/debate/{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/debate/{symbol}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
]);
$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/debate/{symbol}"
req, _ := http.NewRequest("POST", url, nil)
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/debate/{symbol}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/graph/v1/debate/{symbol}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
response = http.request(request)
puts response.read_body{
"bear_thesis": {
"confidence": 58,
"headline": "Extended valuation and earnings risk",
"strength": "MODERATE",
"symbol": "NVDA"
},
"bull_thesis": {
"confidence": 72,
"headline": "Strong momentum with volume confirmation",
"strength": "STRONG",
"symbol": "NVDA"
},
"request": {
"include_historical": true,
"risk_appetite": "moderate",
"symbol": "NVDA",
"timeframe": "swing",
"verbose": false
},
"symbol": "NVDA",
"timestamp": "2026-01-29T10:30:00Z",
"verdict": {
"confidence": 65,
"deciding_factors": [
"Technical momentum outweighs valuation concern",
"FPT suggests favorable timing"
],
"key_risk": "Earnings in 2 weeks",
"timing_recommendation": "Enter on pullback to support",
"verdict": "BUY"
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Path Parameters
Query Parameters
Trading timeframe for context
day, swing, position, investment Risk appetite for position sizing guidance
conservative, moderate, aggressive Include historical analog search from Qdrant
Include full agent narratives in response
LLM model override (e.g. 'gpt-5.2', 'grok-4-1-fast-reasoning'). None = default.
Response
Debate completed successfully
Complete debate response with all agent outputs.
Stock ticker symbol
Original request parameters
Show child attributes
Show child attributes
Bull agent thesis
Show child attributes
Show child attributes
Bear agent counter-thesis
Show child attributes
Show child attributes
Arbiter final verdict
Show child attributes
Show child attributes
Market data context used in debate
Show child attributes
Show child attributes
When debate completed
UUID of persisted debate run
Total debate duration in milliseconds
Total tokens consumed across all agents
Whether all critical validations passed
True if debate was not persisted due to validation failure
Overall quality score (0-100)
0 <= x <= 100List of validation issues found
Status of historical analog retrieval
unavailable, empty, found Show child attributes
Show child attributes