Validate a strategy payload before create/finalize
curl --request POST \
--url https://api.example.com/public/v1/strategies/validate \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"strategyAst": {
"protocol": "traseq.strategy",
"version": 1,
"strategy": {
"kind": "strategy",
"defaults": {
"instrument": {
"symbol": "BTCUSDT"
},
"timeframe": "1h",
"warmupBars": 50
},
"entry": {
"kind": "entry",
"setup": {
"kind": "compare",
"op": "gt",
"left": {
"kind": "market",
"field": "close"
},
"right": {
"kind": "const",
"value": 20000
}
},
"trigger": {
"kind": "compare",
"op": "gt",
"left": {
"kind": "market",
"field": "close"
},
"right": {
"kind": "const",
"value": 20100
}
},
"filters": [
{
"kind": "pattern",
"name": "hammer"
}
],
"action": {
"side": "long",
"sizing": {
"mode": "fixed",
"value": 1
}
}
}
}
},
"settings": {
"maxConcurrentPositions": 1,
"warmupPeriod": 200
},
"signalGraph": {
"protocol": "traseq.signal-graph",
"version": 2,
"nodes": [
{
"id": "close_price",
"kind": "market",
"field": "close"
},
{
"id": "breakout_level",
"kind": "const",
"value": 20100
},
{
"id": "breakout_trigger",
"kind": "compare",
"op": "gt",
"left": {
"ref": "close_price"
},
"right": {
"ref": "breakout_level"
}
}
],
"strategy": {
"kind": "strategy",
"entry": {
"kind": "entry",
"trigger": {
"ref": "breakout_trigger"
},
"action": {
"side": "long",
"sizing": {
"mode": "fixed",
"value": 1
}
}
}
}
}
}
'import requests
url = "https://api.example.com/public/v1/strategies/validate"
payload = {
"strategyAst": {
"protocol": "traseq.strategy",
"version": 1,
"strategy": {
"kind": "strategy",
"defaults": {
"instrument": { "symbol": "BTCUSDT" },
"timeframe": "1h",
"warmupBars": 50
},
"entry": {
"kind": "entry",
"setup": {
"kind": "compare",
"op": "gt",
"left": {
"kind": "market",
"field": "close"
},
"right": {
"kind": "const",
"value": 20000
}
},
"trigger": {
"kind": "compare",
"op": "gt",
"left": {
"kind": "market",
"field": "close"
},
"right": {
"kind": "const",
"value": 20100
}
},
"filters": [
{
"kind": "pattern",
"name": "hammer"
}
],
"action": {
"side": "long",
"sizing": {
"mode": "fixed",
"value": 1
}
}
}
}
},
"settings": {
"maxConcurrentPositions": 1,
"warmupPeriod": 200
},
"signalGraph": {
"protocol": "traseq.signal-graph",
"version": 2,
"nodes": [
{
"id": "close_price",
"kind": "market",
"field": "close"
},
{
"id": "breakout_level",
"kind": "const",
"value": 20100
},
{
"id": "breakout_trigger",
"kind": "compare",
"op": "gt",
"left": { "ref": "close_price" },
"right": { "ref": "breakout_level" }
}
],
"strategy": {
"kind": "strategy",
"entry": {
"kind": "entry",
"trigger": { "ref": "breakout_trigger" },
"action": {
"side": "long",
"sizing": {
"mode": "fixed",
"value": 1
}
}
}
}
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
strategyAst: {
protocol: 'traseq.strategy',
version: 1,
strategy: {
kind: 'strategy',
defaults: {instrument: {symbol: 'BTCUSDT'}, timeframe: '1h', warmupBars: 50},
entry: {
kind: 'entry',
setup: {
kind: 'compare',
op: 'gt',
left: {kind: 'market', field: 'close'},
right: {kind: 'const', value: 20000}
},
trigger: {
kind: 'compare',
op: 'gt',
left: {kind: 'market', field: 'close'},
right: {kind: 'const', value: 20100}
},
filters: [{kind: 'pattern', name: 'hammer'}],
action: {side: 'long', sizing: {mode: 'fixed', value: 1}}
}
}
},
settings: {maxConcurrentPositions: 1, warmupPeriod: 200},
signalGraph: {
protocol: 'traseq.signal-graph',
version: 2,
nodes: [
{id: 'close_price', kind: 'market', field: 'close'},
{id: 'breakout_level', kind: 'const', value: 20100},
{
id: 'breakout_trigger',
kind: 'compare',
op: 'gt',
left: {ref: 'close_price'},
right: {ref: 'breakout_level'}
}
],
strategy: {
kind: 'strategy',
entry: {
kind: 'entry',
trigger: {ref: 'breakout_trigger'},
action: {side: 'long', sizing: {mode: 'fixed', value: 1}}
}
}
}
})
};
fetch('https://api.example.com/public/v1/strategies/validate', 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/public/v1/strategies/validate",
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([
'strategyAst' => [
'protocol' => 'traseq.strategy',
'version' => 1,
'strategy' => [
'kind' => 'strategy',
'defaults' => [
'instrument' => [
'symbol' => 'BTCUSDT'
],
'timeframe' => '1h',
'warmupBars' => 50
],
'entry' => [
'kind' => 'entry',
'setup' => [
'kind' => 'compare',
'op' => 'gt',
'left' => [
'kind' => 'market',
'field' => 'close'
],
'right' => [
'kind' => 'const',
'value' => 20000
]
],
'trigger' => [
'kind' => 'compare',
'op' => 'gt',
'left' => [
'kind' => 'market',
'field' => 'close'
],
'right' => [
'kind' => 'const',
'value' => 20100
]
],
'filters' => [
[
'kind' => 'pattern',
'name' => 'hammer'
]
],
'action' => [
'side' => 'long',
'sizing' => [
'mode' => 'fixed',
'value' => 1
]
]
]
]
],
'settings' => [
'maxConcurrentPositions' => 1,
'warmupPeriod' => 200
],
'signalGraph' => [
'protocol' => 'traseq.signal-graph',
'version' => 2,
'nodes' => [
[
'id' => 'close_price',
'kind' => 'market',
'field' => 'close'
],
[
'id' => 'breakout_level',
'kind' => 'const',
'value' => 20100
],
[
'id' => 'breakout_trigger',
'kind' => 'compare',
'op' => 'gt',
'left' => [
'ref' => 'close_price'
],
'right' => [
'ref' => 'breakout_level'
]
]
],
'strategy' => [
'kind' => 'strategy',
'entry' => [
'kind' => 'entry',
'trigger' => [
'ref' => 'breakout_trigger'
],
'action' => [
'side' => 'long',
'sizing' => [
'mode' => 'fixed',
'value' => 1
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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/public/v1/strategies/validate"
payload := strings.NewReader("{\n \"strategyAst\": {\n \"protocol\": \"traseq.strategy\",\n \"version\": 1,\n \"strategy\": {\n \"kind\": \"strategy\",\n \"defaults\": {\n \"instrument\": {\n \"symbol\": \"BTCUSDT\"\n },\n \"timeframe\": \"1h\",\n \"warmupBars\": 50\n },\n \"entry\": {\n \"kind\": \"entry\",\n \"setup\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20000\n }\n },\n \"trigger\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20100\n }\n },\n \"filters\": [\n {\n \"kind\": \"pattern\",\n \"name\": \"hammer\"\n }\n ],\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n },\n \"settings\": {\n \"maxConcurrentPositions\": 1,\n \"warmupPeriod\": 200\n },\n \"signalGraph\": {\n \"protocol\": \"traseq.signal-graph\",\n \"version\": 2,\n \"nodes\": [\n {\n \"id\": \"close_price\",\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n {\n \"id\": \"breakout_level\",\n \"kind\": \"const\",\n \"value\": 20100\n },\n {\n \"id\": \"breakout_trigger\",\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"ref\": \"close_price\"\n },\n \"right\": {\n \"ref\": \"breakout_level\"\n }\n }\n ],\n \"strategy\": {\n \"kind\": \"strategy\",\n \"entry\": {\n \"kind\": \"entry\",\n \"trigger\": {\n \"ref\": \"breakout_trigger\"\n },\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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/public/v1/strategies/validate")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"strategyAst\": {\n \"protocol\": \"traseq.strategy\",\n \"version\": 1,\n \"strategy\": {\n \"kind\": \"strategy\",\n \"defaults\": {\n \"instrument\": {\n \"symbol\": \"BTCUSDT\"\n },\n \"timeframe\": \"1h\",\n \"warmupBars\": 50\n },\n \"entry\": {\n \"kind\": \"entry\",\n \"setup\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20000\n }\n },\n \"trigger\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20100\n }\n },\n \"filters\": [\n {\n \"kind\": \"pattern\",\n \"name\": \"hammer\"\n }\n ],\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n },\n \"settings\": {\n \"maxConcurrentPositions\": 1,\n \"warmupPeriod\": 200\n },\n \"signalGraph\": {\n \"protocol\": \"traseq.signal-graph\",\n \"version\": 2,\n \"nodes\": [\n {\n \"id\": \"close_price\",\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n {\n \"id\": \"breakout_level\",\n \"kind\": \"const\",\n \"value\": 20100\n },\n {\n \"id\": \"breakout_trigger\",\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"ref\": \"close_price\"\n },\n \"right\": {\n \"ref\": \"breakout_level\"\n }\n }\n ],\n \"strategy\": {\n \"kind\": \"strategy\",\n \"entry\": {\n \"kind\": \"entry\",\n \"trigger\": {\n \"ref\": \"breakout_trigger\"\n },\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/public/v1/strategies/validate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"strategyAst\": {\n \"protocol\": \"traseq.strategy\",\n \"version\": 1,\n \"strategy\": {\n \"kind\": \"strategy\",\n \"defaults\": {\n \"instrument\": {\n \"symbol\": \"BTCUSDT\"\n },\n \"timeframe\": \"1h\",\n \"warmupBars\": 50\n },\n \"entry\": {\n \"kind\": \"entry\",\n \"setup\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20000\n }\n },\n \"trigger\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20100\n }\n },\n \"filters\": [\n {\n \"kind\": \"pattern\",\n \"name\": \"hammer\"\n }\n ],\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n },\n \"settings\": {\n \"maxConcurrentPositions\": 1,\n \"warmupPeriod\": 200\n },\n \"signalGraph\": {\n \"protocol\": \"traseq.signal-graph\",\n \"version\": 2,\n \"nodes\": [\n {\n \"id\": \"close_price\",\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n {\n \"id\": \"breakout_level\",\n \"kind\": \"const\",\n \"value\": 20100\n },\n {\n \"id\": \"breakout_trigger\",\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"ref\": \"close_price\"\n },\n \"right\": {\n \"ref\": \"breakout_level\"\n }\n }\n ],\n \"strategy\": {\n \"kind\": \"strategy\",\n \"entry\": {\n \"kind\": \"entry\",\n \"trigger\": {\n \"ref\": \"breakout_trigger\"\n },\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n }\n}"
response = http.request(request)
puts response.read_bodyAgent API
Validate a strategy payload before create/finalize
Runs finalize-grade validation, including token semantics, conflicts, settings, and subscription-tier condition limits.
POST
/
public
/
v1
/
strategies
/
validate
Validate a strategy payload before create/finalize
curl --request POST \
--url https://api.example.com/public/v1/strategies/validate \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"strategyAst": {
"protocol": "traseq.strategy",
"version": 1,
"strategy": {
"kind": "strategy",
"defaults": {
"instrument": {
"symbol": "BTCUSDT"
},
"timeframe": "1h",
"warmupBars": 50
},
"entry": {
"kind": "entry",
"setup": {
"kind": "compare",
"op": "gt",
"left": {
"kind": "market",
"field": "close"
},
"right": {
"kind": "const",
"value": 20000
}
},
"trigger": {
"kind": "compare",
"op": "gt",
"left": {
"kind": "market",
"field": "close"
},
"right": {
"kind": "const",
"value": 20100
}
},
"filters": [
{
"kind": "pattern",
"name": "hammer"
}
],
"action": {
"side": "long",
"sizing": {
"mode": "fixed",
"value": 1
}
}
}
}
},
"settings": {
"maxConcurrentPositions": 1,
"warmupPeriod": 200
},
"signalGraph": {
"protocol": "traseq.signal-graph",
"version": 2,
"nodes": [
{
"id": "close_price",
"kind": "market",
"field": "close"
},
{
"id": "breakout_level",
"kind": "const",
"value": 20100
},
{
"id": "breakout_trigger",
"kind": "compare",
"op": "gt",
"left": {
"ref": "close_price"
},
"right": {
"ref": "breakout_level"
}
}
],
"strategy": {
"kind": "strategy",
"entry": {
"kind": "entry",
"trigger": {
"ref": "breakout_trigger"
},
"action": {
"side": "long",
"sizing": {
"mode": "fixed",
"value": 1
}
}
}
}
}
}
'import requests
url = "https://api.example.com/public/v1/strategies/validate"
payload = {
"strategyAst": {
"protocol": "traseq.strategy",
"version": 1,
"strategy": {
"kind": "strategy",
"defaults": {
"instrument": { "symbol": "BTCUSDT" },
"timeframe": "1h",
"warmupBars": 50
},
"entry": {
"kind": "entry",
"setup": {
"kind": "compare",
"op": "gt",
"left": {
"kind": "market",
"field": "close"
},
"right": {
"kind": "const",
"value": 20000
}
},
"trigger": {
"kind": "compare",
"op": "gt",
"left": {
"kind": "market",
"field": "close"
},
"right": {
"kind": "const",
"value": 20100
}
},
"filters": [
{
"kind": "pattern",
"name": "hammer"
}
],
"action": {
"side": "long",
"sizing": {
"mode": "fixed",
"value": 1
}
}
}
}
},
"settings": {
"maxConcurrentPositions": 1,
"warmupPeriod": 200
},
"signalGraph": {
"protocol": "traseq.signal-graph",
"version": 2,
"nodes": [
{
"id": "close_price",
"kind": "market",
"field": "close"
},
{
"id": "breakout_level",
"kind": "const",
"value": 20100
},
{
"id": "breakout_trigger",
"kind": "compare",
"op": "gt",
"left": { "ref": "close_price" },
"right": { "ref": "breakout_level" }
}
],
"strategy": {
"kind": "strategy",
"entry": {
"kind": "entry",
"trigger": { "ref": "breakout_trigger" },
"action": {
"side": "long",
"sizing": {
"mode": "fixed",
"value": 1
}
}
}
}
}
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
strategyAst: {
protocol: 'traseq.strategy',
version: 1,
strategy: {
kind: 'strategy',
defaults: {instrument: {symbol: 'BTCUSDT'}, timeframe: '1h', warmupBars: 50},
entry: {
kind: 'entry',
setup: {
kind: 'compare',
op: 'gt',
left: {kind: 'market', field: 'close'},
right: {kind: 'const', value: 20000}
},
trigger: {
kind: 'compare',
op: 'gt',
left: {kind: 'market', field: 'close'},
right: {kind: 'const', value: 20100}
},
filters: [{kind: 'pattern', name: 'hammer'}],
action: {side: 'long', sizing: {mode: 'fixed', value: 1}}
}
}
},
settings: {maxConcurrentPositions: 1, warmupPeriod: 200},
signalGraph: {
protocol: 'traseq.signal-graph',
version: 2,
nodes: [
{id: 'close_price', kind: 'market', field: 'close'},
{id: 'breakout_level', kind: 'const', value: 20100},
{
id: 'breakout_trigger',
kind: 'compare',
op: 'gt',
left: {ref: 'close_price'},
right: {ref: 'breakout_level'}
}
],
strategy: {
kind: 'strategy',
entry: {
kind: 'entry',
trigger: {ref: 'breakout_trigger'},
action: {side: 'long', sizing: {mode: 'fixed', value: 1}}
}
}
}
})
};
fetch('https://api.example.com/public/v1/strategies/validate', 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/public/v1/strategies/validate",
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([
'strategyAst' => [
'protocol' => 'traseq.strategy',
'version' => 1,
'strategy' => [
'kind' => 'strategy',
'defaults' => [
'instrument' => [
'symbol' => 'BTCUSDT'
],
'timeframe' => '1h',
'warmupBars' => 50
],
'entry' => [
'kind' => 'entry',
'setup' => [
'kind' => 'compare',
'op' => 'gt',
'left' => [
'kind' => 'market',
'field' => 'close'
],
'right' => [
'kind' => 'const',
'value' => 20000
]
],
'trigger' => [
'kind' => 'compare',
'op' => 'gt',
'left' => [
'kind' => 'market',
'field' => 'close'
],
'right' => [
'kind' => 'const',
'value' => 20100
]
],
'filters' => [
[
'kind' => 'pattern',
'name' => 'hammer'
]
],
'action' => [
'side' => 'long',
'sizing' => [
'mode' => 'fixed',
'value' => 1
]
]
]
]
],
'settings' => [
'maxConcurrentPositions' => 1,
'warmupPeriod' => 200
],
'signalGraph' => [
'protocol' => 'traseq.signal-graph',
'version' => 2,
'nodes' => [
[
'id' => 'close_price',
'kind' => 'market',
'field' => 'close'
],
[
'id' => 'breakout_level',
'kind' => 'const',
'value' => 20100
],
[
'id' => 'breakout_trigger',
'kind' => 'compare',
'op' => 'gt',
'left' => [
'ref' => 'close_price'
],
'right' => [
'ref' => 'breakout_level'
]
]
],
'strategy' => [
'kind' => 'strategy',
'entry' => [
'kind' => 'entry',
'trigger' => [
'ref' => 'breakout_trigger'
],
'action' => [
'side' => 'long',
'sizing' => [
'mode' => 'fixed',
'value' => 1
]
]
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-api-key: <api-key>"
],
]);
$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/public/v1/strategies/validate"
payload := strings.NewReader("{\n \"strategyAst\": {\n \"protocol\": \"traseq.strategy\",\n \"version\": 1,\n \"strategy\": {\n \"kind\": \"strategy\",\n \"defaults\": {\n \"instrument\": {\n \"symbol\": \"BTCUSDT\"\n },\n \"timeframe\": \"1h\",\n \"warmupBars\": 50\n },\n \"entry\": {\n \"kind\": \"entry\",\n \"setup\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20000\n }\n },\n \"trigger\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20100\n }\n },\n \"filters\": [\n {\n \"kind\": \"pattern\",\n \"name\": \"hammer\"\n }\n ],\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n },\n \"settings\": {\n \"maxConcurrentPositions\": 1,\n \"warmupPeriod\": 200\n },\n \"signalGraph\": {\n \"protocol\": \"traseq.signal-graph\",\n \"version\": 2,\n \"nodes\": [\n {\n \"id\": \"close_price\",\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n {\n \"id\": \"breakout_level\",\n \"kind\": \"const\",\n \"value\": 20100\n },\n {\n \"id\": \"breakout_trigger\",\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"ref\": \"close_price\"\n },\n \"right\": {\n \"ref\": \"breakout_level\"\n }\n }\n ],\n \"strategy\": {\n \"kind\": \"strategy\",\n \"entry\": {\n \"kind\": \"entry\",\n \"trigger\": {\n \"ref\": \"breakout_trigger\"\n },\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
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/public/v1/strategies/validate")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"strategyAst\": {\n \"protocol\": \"traseq.strategy\",\n \"version\": 1,\n \"strategy\": {\n \"kind\": \"strategy\",\n \"defaults\": {\n \"instrument\": {\n \"symbol\": \"BTCUSDT\"\n },\n \"timeframe\": \"1h\",\n \"warmupBars\": 50\n },\n \"entry\": {\n \"kind\": \"entry\",\n \"setup\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20000\n }\n },\n \"trigger\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20100\n }\n },\n \"filters\": [\n {\n \"kind\": \"pattern\",\n \"name\": \"hammer\"\n }\n ],\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n },\n \"settings\": {\n \"maxConcurrentPositions\": 1,\n \"warmupPeriod\": 200\n },\n \"signalGraph\": {\n \"protocol\": \"traseq.signal-graph\",\n \"version\": 2,\n \"nodes\": [\n {\n \"id\": \"close_price\",\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n {\n \"id\": \"breakout_level\",\n \"kind\": \"const\",\n \"value\": 20100\n },\n {\n \"id\": \"breakout_trigger\",\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"ref\": \"close_price\"\n },\n \"right\": {\n \"ref\": \"breakout_level\"\n }\n }\n ],\n \"strategy\": {\n \"kind\": \"strategy\",\n \"entry\": {\n \"kind\": \"entry\",\n \"trigger\": {\n \"ref\": \"breakout_trigger\"\n },\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/public/v1/strategies/validate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"strategyAst\": {\n \"protocol\": \"traseq.strategy\",\n \"version\": 1,\n \"strategy\": {\n \"kind\": \"strategy\",\n \"defaults\": {\n \"instrument\": {\n \"symbol\": \"BTCUSDT\"\n },\n \"timeframe\": \"1h\",\n \"warmupBars\": 50\n },\n \"entry\": {\n \"kind\": \"entry\",\n \"setup\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20000\n }\n },\n \"trigger\": {\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n \"right\": {\n \"kind\": \"const\",\n \"value\": 20100\n }\n },\n \"filters\": [\n {\n \"kind\": \"pattern\",\n \"name\": \"hammer\"\n }\n ],\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n },\n \"settings\": {\n \"maxConcurrentPositions\": 1,\n \"warmupPeriod\": 200\n },\n \"signalGraph\": {\n \"protocol\": \"traseq.signal-graph\",\n \"version\": 2,\n \"nodes\": [\n {\n \"id\": \"close_price\",\n \"kind\": \"market\",\n \"field\": \"close\"\n },\n {\n \"id\": \"breakout_level\",\n \"kind\": \"const\",\n \"value\": 20100\n },\n {\n \"id\": \"breakout_trigger\",\n \"kind\": \"compare\",\n \"op\": \"gt\",\n \"left\": {\n \"ref\": \"close_price\"\n },\n \"right\": {\n \"ref\": \"breakout_level\"\n }\n }\n ],\n \"strategy\": {\n \"kind\": \"strategy\",\n \"entry\": {\n \"kind\": \"entry\",\n \"trigger\": {\n \"ref\": \"breakout_trigger\"\n },\n \"action\": {\n \"side\": \"long\",\n \"sizing\": {\n \"mode\": \"fixed\",\n \"value\": 1\n }\n }\n }\n }\n }\n}"
response = http.request(request)
puts response.read_bodyAuthorizations
Workspace API key for public agent API access
Body
application/json
- Option 1
- Option 2
Canonical strategy protocol payload. Use this when the client already authors StrategyAstV1 directly.
Example:
{
"protocol": "traseq.strategy",
"version": 1,
"strategy": {
"kind": "strategy",
"defaults": {
"instrument": { "symbol": "BTCUSDT" },
"timeframe": "1h",
"warmupBars": 50
},
"entry": {
"kind": "entry",
"setup": {
"kind": "compare",
"op": "gt",
"left": { "kind": "market", "field": "close" },
"right": { "kind": "const", "value": 20000 }
},
"trigger": {
"kind": "compare",
"op": "gt",
"left": { "kind": "market", "field": "close" },
"right": { "kind": "const", "value": 20100 }
},
"filters": [{ "kind": "pattern", "name": "hammer" }],
"action": {
"side": "long",
"sizing": { "mode": "fixed", "value": 1 }
}
}
}
}
Show child attributes
Show child attributes
Higher-level AI agent authoring graph. The backend compiles this to canonical strategyAst before validation and persistence.
Show child attributes
Show child attributes
Example:
{
"protocol": "traseq.signal-graph",
"version": 2,
"nodes": [
{
"id": "close_price",
"kind": "market",
"field": "close"
},
{
"id": "breakout_level",
"kind": "const",
"value": 20100
},
{
"id": "breakout_trigger",
"kind": "compare",
"op": "gt",
"left": { "ref": "close_price" },
"right": { "ref": "breakout_level" }
}
],
"strategy": {
"kind": "strategy",
"entry": {
"kind": "entry",
"trigger": { "ref": "breakout_trigger" },
"action": {
"side": "long",
"sizing": { "mode": "fixed", "value": 1 }
}
}
}
}
Response
200
Validation summary with issues
⌘I