const res = await fetch('https://sandbox.trdrs.co/api/pre-registration/conformance/runs', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.TRDRS_API_KEY}` },
})
const data = await res.json()curl -X POST 'https://sandbox.trdrs.co/api/pre-registration/conformance/runs' \
-H "Authorization: Bearer $TRDRS_API_KEY"import requests
url = "https://sandbox.trdrs.co/api/pre-registration/conformance/runs"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.trdrs.co/api/pre-registration/conformance/runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://sandbox.trdrs.co/api/pre-registration/conformance/runs"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.trdrs.co/api/pre-registration/conformance/runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.trdrs.co/api/pre-registration/conformance/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"run": {
"id": "96507d96-8c4f-4b84-a718-a72dd77ba104",
"status": "open",
"ruleset": "partner",
"rulesetVersion": "1.0",
"openedAt": "2026-09-11T12:00:00.000Z",
"expiresAt": "2026-09-11T14:00:00.000Z",
"closedAt": null,
"certificateExpiresAt": null
},
"grade": {
"ruleset": "partner",
"rulesetVersion": "1.0",
"passed": false,
"outstanding": [
"stream_reconnect"
],
"results": [
{
"rule": "stream_reconnect",
"title": "Streams recover from a reconnect snapshot",
"kind": "injected",
"outcome": "not_exercised",
"passes": 0,
"failures": 0,
"note": "Open an account stream and reconnect after the sandbox drops it."
}
]
}
}Start a sandbox conformance run
Opens a free two-hour conformance run in the sandbox. During the run, trdrs watches the requests you make with your pre-registration and Trading API keys, and injects one rate limit, one risk lock and one dropped account and market stream for your client to handle. You can have one run open at a time.
Required key: pre-registration key, in the sandbox.
const res = await fetch('https://sandbox.trdrs.co/api/pre-registration/conformance/runs', {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.TRDRS_API_KEY}` },
})
const data = await res.json()curl -X POST 'https://sandbox.trdrs.co/api/pre-registration/conformance/runs' \
-H "Authorization: Bearer $TRDRS_API_KEY"import requests
url = "https://sandbox.trdrs.co/api/pre-registration/conformance/runs"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.trdrs.co/api/pre-registration/conformance/runs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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://sandbox.trdrs.co/api/pre-registration/conformance/runs"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://sandbox.trdrs.co/api/pre-registration/conformance/runs")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.trdrs.co/api/pre-registration/conformance/runs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"run": {
"id": "96507d96-8c4f-4b84-a718-a72dd77ba104",
"status": "open",
"ruleset": "partner",
"rulesetVersion": "1.0",
"openedAt": "2026-09-11T12:00:00.000Z",
"expiresAt": "2026-09-11T14:00:00.000Z",
"closedAt": null,
"certificateExpiresAt": null
},
"grade": {
"ruleset": "partner",
"rulesetVersion": "1.0",
"passed": false,
"outstanding": [
"stream_reconnect"
],
"results": [
{
"rule": "stream_reconnect",
"title": "Streams recover from a reconnect snapshot",
"kind": "injected",
"outcome": "not_exercised",
"passes": 0,
"failures": 0,
"note": "Open an account stream and reconnect after the sandbox drops it."
}
]
}
}Authorizations
The pre-registration key (trdrs_sk_…), issued to a venue for Connect pre-registration and conformance runs in the sandbox. It works only on those routes under /api/pre-registration/, outside the venue routes. It looks like a Trading API key but has a different scope: a Trading API key is refused here, and a pre-registration key is refused everywhere else. A venue’s backend calls the venue routes with its Venue key.
Response
The run, with its results so far.
A conformance run, with its grade and the rules it checks.
One conformance run in the sandbox.
Show child attributes
Show child attributes
How the run did against each rule.
Show child attributes
Show child attributes
The rules the run checks, with how to exercise each.
Show child attributes
Show child attributes
What you attest to separately, because the run can't measure it, or null when the run measures every rule.