const res = await fetch('https://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_VENUE_KEY}`,
"Idempotency-Key": "example-request-1",
},
body: JSON.stringify({
"manifest": {
"providerVersion": "example-1",
"protocolVersion": "1.0",
"schemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"capabilities": {
"accounts": false,
"execution": false,
"marketData": true,
"generationFencing": false,
"completeOrderBook": false,
"executionHistory": false,
"executionCorrections": false,
"orderTypes": [],
"timeInForce": [],
"reduceOnly": false,
"nativeReplace": false,
"nativeOco": false,
"accountProvisioning": false,
"positionModels": [],
"replayRetentionSeconds": 0
}
},
"evidence": {
"suite": "provider-market-data-v1",
"url": "https://example.com/evidence",
"environment": "sandbox"
},
"expectedVersion": 1
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases' \
-H "Authorization: Bearer $TRDRS_VENUE_KEY" \
-H 'Idempotency-Key: example-request-1' \
-H 'content-type: application/json' \
-d '{"manifest":{"providerVersion":"example-1","protocolVersion":"1.0","schemaDigest":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","capabilities":{"accounts":false,"execution":false,"marketData":true,"generationFencing":false,"completeOrderBook":false,"executionHistory":false,"executionCorrections":false,"orderTypes":[],"timeInForce":[],"reduceOnly":false,"nativeReplace":false,"nativeOco":false,"accountProvisioning":false,"positionModels":[],"replayRetentionSeconds":0}},"evidence":{"suite":"provider-market-data-v1","url":"https://example.com/evidence","environment":"sandbox"},"expectedVersion":1}'import requests
url = "https://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases"
payload = {
"manifest": {
"providerVersion": "example-1",
"protocolVersion": "1.0",
"schemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"capabilities": {
"accounts": False,
"execution": False,
"marketData": True,
"generationFencing": False,
"completeOrderBook": False,
"executionHistory": False,
"executionCorrections": False,
"orderTypes": [],
"timeInForce": [],
"reduceOnly": False,
"nativeReplace": False,
"nativeOco": False,
"accountProvisioning": False,
"positionModels": [],
"replayRetentionSeconds": 0
}
},
"evidence": {
"suite": "provider-market-data-v1",
"url": "https://example.com/evidence",
"environment": "sandbox"
},
"expectedVersion": 1
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases",
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([
'manifest' => [
'providerVersion' => 'example-1',
'protocolVersion' => '1.0',
'schemaDigest' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
'capabilities' => [
'accounts' => false,
'execution' => false,
'marketData' => true,
'generationFencing' => false,
'completeOrderBook' => false,
'executionHistory' => false,
'executionCorrections' => false,
'orderTypes' => [
],
'timeInForce' => [
],
'reduceOnly' => false,
'nativeReplace' => false,
'nativeOco' => false,
'accountProvisioning' => false,
'positionModels' => [
],
'replayRetentionSeconds' => 0
]
],
'evidence' => [
'suite' => 'provider-market-data-v1',
'url' => 'https://example.com/evidence',
'environment' => 'sandbox'
],
'expectedVersion' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-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://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases"
payload := strings.NewReader("{\n \"manifest\": {\n \"providerVersion\": \"example-1\",\n \"protocolVersion\": \"1.0\",\n \"schemaDigest\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"capabilities\": {\n \"accounts\": false,\n \"execution\": false,\n \"marketData\": true,\n \"generationFencing\": false,\n \"completeOrderBook\": false,\n \"executionHistory\": false,\n \"executionCorrections\": false,\n \"orderTypes\": [],\n \"timeInForce\": [],\n \"reduceOnly\": false,\n \"nativeReplace\": false,\n \"nativeOco\": false,\n \"accountProvisioning\": false,\n \"positionModels\": [],\n \"replayRetentionSeconds\": 0\n }\n },\n \"evidence\": {\n \"suite\": \"provider-market-data-v1\",\n \"url\": \"https://example.com/evidence\",\n \"environment\": \"sandbox\"\n },\n \"expectedVersion\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"manifest\": {\n \"providerVersion\": \"example-1\",\n \"protocolVersion\": \"1.0\",\n \"schemaDigest\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"capabilities\": {\n \"accounts\": false,\n \"execution\": false,\n \"marketData\": true,\n \"generationFencing\": false,\n \"completeOrderBook\": false,\n \"executionHistory\": false,\n \"executionCorrections\": false,\n \"orderTypes\": [],\n \"timeInForce\": [],\n \"reduceOnly\": false,\n \"nativeReplace\": false,\n \"nativeOco\": false,\n \"accountProvisioning\": false,\n \"positionModels\": [],\n \"replayRetentionSeconds\": 0\n }\n },\n \"evidence\": {\n \"suite\": \"provider-market-data-v1\",\n \"url\": \"https://example.com/evidence\",\n \"environment\": \"sandbox\"\n },\n \"expectedVersion\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"manifest\": {\n \"providerVersion\": \"example-1\",\n \"protocolVersion\": \"1.0\",\n \"schemaDigest\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"capabilities\": {\n \"accounts\": false,\n \"execution\": false,\n \"marketData\": true,\n \"generationFencing\": false,\n \"completeOrderBook\": false,\n \"executionHistory\": false,\n \"executionCorrections\": false,\n \"orderTypes\": [],\n \"timeInForce\": [],\n \"reduceOnly\": false,\n \"nativeReplace\": false,\n \"nativeOco\": false,\n \"accountProvisioning\": false,\n \"positionModels\": [],\n \"replayRetentionSeconds\": 0\n }\n },\n \"evidence\": {\n \"suite\": \"provider-market-data-v1\",\n \"url\": \"https://example.com/evidence\",\n \"environment\": \"sandbox\"\n },\n \"expectedVersion\": 1\n}"
response = http.request(request)
puts response.read_body{
"release": {
"id": "00000000-0000-0000-0000-000000000001",
"companyId": "00000000-0000-0000-0000-000000000001",
"manifest": {
"providerVersion": "example-1",
"protocolVersion": "1.0",
"schemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"capabilities": {
"accounts": false,
"execution": false,
"marketData": true,
"generationFencing": false,
"completeOrderBook": false,
"executionHistory": false,
"executionCorrections": false,
"orderTypes": [],
"timeInForce": [],
"reduceOnly": false,
"nativeReplace": false,
"nativeOco": false,
"accountProvisioning": false,
"positionModels": [],
"replayRetentionSeconds": 0
}
},
"manifestHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"authoredBy": "user_1",
"authoredOrganizationId": "00000000-0000-0000-0000-000000000001",
"profileVersion": 1,
"state": "draft",
"evidence": {
"suite": "provider-market-data-v1",
"url": "https://example.com/evidence",
"environment": "sandbox"
},
"review": null,
"createdAt": "2026-09-14T12:00:00.000Z"
}
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Record an immutable provider release
Preview: served on the sandbox to every venue, and production availability is arranged when a venue qualifies. Trading API keys and Partner keys do not authorize these routes. Provider directory publication is separate from execution qualification, trader Connect and private customer connections. No credential, private endpoint or account binding is published. Profile changes hide the listing until a release for the new profile version is reviewed. Every write requires Idempotency-Key; an identical retry returns its original result, a changed body refuses with idempotency_conflict. Required scope: provider:manage. Requires the maintaining owner and provider:manage. Evidence is a link, not approval. Data-only manifests require provider-market-data-v1; execution manifests require the complete provider-contract-v1 suite. Manifest, digest, author and evidence cannot be changed afterward.
const res = await fetch('https://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_VENUE_KEY}`,
"Idempotency-Key": "example-request-1",
},
body: JSON.stringify({
"manifest": {
"providerVersion": "example-1",
"protocolVersion": "1.0",
"schemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"capabilities": {
"accounts": false,
"execution": false,
"marketData": true,
"generationFencing": false,
"completeOrderBook": false,
"executionHistory": false,
"executionCorrections": false,
"orderTypes": [],
"timeInForce": [],
"reduceOnly": false,
"nativeReplace": false,
"nativeOco": false,
"accountProvisioning": false,
"positionModels": [],
"replayRetentionSeconds": 0
}
},
"evidence": {
"suite": "provider-market-data-v1",
"url": "https://example.com/evidence",
"environment": "sandbox"
},
"expectedVersion": 1
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases' \
-H "Authorization: Bearer $TRDRS_VENUE_KEY" \
-H 'Idempotency-Key: example-request-1' \
-H 'content-type: application/json' \
-d '{"manifest":{"providerVersion":"example-1","protocolVersion":"1.0","schemaDigest":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","capabilities":{"accounts":false,"execution":false,"marketData":true,"generationFencing":false,"completeOrderBook":false,"executionHistory":false,"executionCorrections":false,"orderTypes":[],"timeInForce":[],"reduceOnly":false,"nativeReplace":false,"nativeOco":false,"accountProvisioning":false,"positionModels":[],"replayRetentionSeconds":0}},"evidence":{"suite":"provider-market-data-v1","url":"https://example.com/evidence","environment":"sandbox"},"expectedVersion":1}'import requests
url = "https://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases"
payload = {
"manifest": {
"providerVersion": "example-1",
"protocolVersion": "1.0",
"schemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"capabilities": {
"accounts": False,
"execution": False,
"marketData": True,
"generationFencing": False,
"completeOrderBook": False,
"executionHistory": False,
"executionCorrections": False,
"orderTypes": [],
"timeInForce": [],
"reduceOnly": False,
"nativeReplace": False,
"nativeOco": False,
"accountProvisioning": False,
"positionModels": [],
"replayRetentionSeconds": 0
}
},
"evidence": {
"suite": "provider-market-data-v1",
"url": "https://example.com/evidence",
"environment": "sandbox"
},
"expectedVersion": 1
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases",
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([
'manifest' => [
'providerVersion' => 'example-1',
'protocolVersion' => '1.0',
'schemaDigest' => 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
'capabilities' => [
'accounts' => false,
'execution' => false,
'marketData' => true,
'generationFencing' => false,
'completeOrderBook' => false,
'executionHistory' => false,
'executionCorrections' => false,
'orderTypes' => [
],
'timeInForce' => [
],
'reduceOnly' => false,
'nativeReplace' => false,
'nativeOco' => false,
'accountProvisioning' => false,
'positionModels' => [
],
'replayRetentionSeconds' => 0
]
],
'evidence' => [
'suite' => 'provider-market-data-v1',
'url' => 'https://example.com/evidence',
'environment' => 'sandbox'
],
'expectedVersion' => 1
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-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://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases"
payload := strings.NewReader("{\n \"manifest\": {\n \"providerVersion\": \"example-1\",\n \"protocolVersion\": \"1.0\",\n \"schemaDigest\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"capabilities\": {\n \"accounts\": false,\n \"execution\": false,\n \"marketData\": true,\n \"generationFencing\": false,\n \"completeOrderBook\": false,\n \"executionHistory\": false,\n \"executionCorrections\": false,\n \"orderTypes\": [],\n \"timeInForce\": [],\n \"reduceOnly\": false,\n \"nativeReplace\": false,\n \"nativeOco\": false,\n \"accountProvisioning\": false,\n \"positionModels\": [],\n \"replayRetentionSeconds\": 0\n }\n },\n \"evidence\": {\n \"suite\": \"provider-market-data-v1\",\n \"url\": \"https://example.com/evidence\",\n \"environment\": \"sandbox\"\n },\n \"expectedVersion\": 1\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"manifest\": {\n \"providerVersion\": \"example-1\",\n \"protocolVersion\": \"1.0\",\n \"schemaDigest\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"capabilities\": {\n \"accounts\": false,\n \"execution\": false,\n \"marketData\": true,\n \"generationFencing\": false,\n \"completeOrderBook\": false,\n \"executionHistory\": false,\n \"executionCorrections\": false,\n \"orderTypes\": [],\n \"timeInForce\": [],\n \"reduceOnly\": false,\n \"nativeReplace\": false,\n \"nativeOco\": false,\n \"accountProvisioning\": false,\n \"positionModels\": [],\n \"replayRetentionSeconds\": 0\n }\n },\n \"evidence\": {\n \"suite\": \"provider-market-data-v1\",\n \"url\": \"https://example.com/evidence\",\n \"environment\": \"sandbox\"\n },\n \"expectedVersion\": 1\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/partner/venues/{venueId}/provider-catalog/profiles/{companyId}/releases")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"manifest\": {\n \"providerVersion\": \"example-1\",\n \"protocolVersion\": \"1.0\",\n \"schemaDigest\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"capabilities\": {\n \"accounts\": false,\n \"execution\": false,\n \"marketData\": true,\n \"generationFencing\": false,\n \"completeOrderBook\": false,\n \"executionHistory\": false,\n \"executionCorrections\": false,\n \"orderTypes\": [],\n \"timeInForce\": [],\n \"reduceOnly\": false,\n \"nativeReplace\": false,\n \"nativeOco\": false,\n \"accountProvisioning\": false,\n \"positionModels\": [],\n \"replayRetentionSeconds\": 0\n }\n },\n \"evidence\": {\n \"suite\": \"provider-market-data-v1\",\n \"url\": \"https://example.com/evidence\",\n \"environment\": \"sandbox\"\n },\n \"expectedVersion\": 1\n}"
response = http.request(request)
puts response.read_body{
"release": {
"id": "00000000-0000-0000-0000-000000000001",
"companyId": "00000000-0000-0000-0000-000000000001",
"manifest": {
"providerVersion": "example-1",
"protocolVersion": "1.0",
"schemaDigest": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"capabilities": {
"accounts": false,
"execution": false,
"marketData": true,
"generationFencing": false,
"completeOrderBook": false,
"executionHistory": false,
"executionCorrections": false,
"orderTypes": [],
"timeInForce": [],
"reduceOnly": false,
"nativeReplace": false,
"nativeOco": false,
"accountProvisioning": false,
"positionModels": [],
"replayRetentionSeconds": 0
}
},
"manifestHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"authoredBy": "user_1",
"authoredOrganizationId": "00000000-0000-0000-0000-000000000001",
"profileVersion": 1,
"state": "draft",
"evidence": {
"suite": "provider-market-data-v1",
"url": "https://example.com/evidence",
"environment": "sandbox"
},
"review": null,
"createdAt": "2026-09-14T12:00:00.000Z"
}
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Authorizations
The Venue key (trdrs_vk_sandbox_… or trdrs_vk_production_…), in preview. It belongs to one venue in one environment and carries the scopes it was created with. The venue's verified owner creates it while signed in, and it works only on the /api/partner/venues/{venueId} routes. A trdrs_sk_… key can't be used in its place. It never lets you act as a trader, sign in or manage keys. Keep it on your server.
Headers
A key you choose, 1 to 128 characters, that identifies this write. Send the same key when you retry it, so the write is never applied twice.
1 - 128Body
A public provider's declaration of what it supports, checked against the provider contract. A provider must offer accounts, market data or both. One that offers execution must also offer accounts, generation fencing, a complete order book and execution history, keep at least seven days of replay, and list at least one order type, time in force and position model; one that doesn't can't declare any execution feature, and account provisioning and position models need accounts. Lists hold no duplicates, and registering a manifest doesn't certify its claims.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
x >= 1Response
Success. The response is sent with Cache-Control: no-store, so don't cache it.
Show child attributes
Show child attributes