const res = await fetch('https://app.trdrs.co/api/venues/{venueId}/retire', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_VENUE_KEY}`,
"Idempotency-Key": "example-request-1",
},
body: JSON.stringify({
"confirmName": "Example venue"
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/venues/{venueId}/retire' \
-H "Authorization: Bearer $TRDRS_VENUE_KEY" \
-H 'Idempotency-Key: example-request-1' \
-H 'content-type: application/json' \
-d '{"confirmName":"Example venue"}'import requests
url = "https://app.trdrs.co/api/venues/{venueId}/retire"
payload = { "confirmName": "Example venue" }
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/venues/{venueId}/retire",
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([
'confirmName' => 'Example venue'
]),
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/venues/{venueId}/retire"
payload := strings.NewReader("{\n \"confirmName\": \"Example venue\"\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/venues/{venueId}/retire")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"confirmName\": \"Example venue\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/venues/{venueId}/retire")
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 \"confirmName\": \"Example venue\"\n}"
response = http.request(request)
puts response.read_body{
"venue": {
"id": "00000000-0000-0000-0000-000000000001",
"organizationId": "00000000-0000-0000-0000-000000000001",
"name": "Example venue",
"environment": "sandbox",
"state": "retired",
"version": 3,
"createdAt": "2026-09-14T12:00:00.000Z",
"rules": {
"applies": {
"orders": true,
"fills": true,
"stages": true
},
"appliesAtProvider": {
"orders": false,
"fills": false,
"stages": false
}
},
"company": null
},
"retirement": {
"retiredAt": "2026-10-26T12:00:00.000Z",
"accounts": 12,
"keys": 2,
"connections": 1,
"routes": 1
}
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Retire the venue
Retires the venue for good. Use it when the venue is finished, such as a sandbox venue you built to test with. Send confirmName as the venue’s current name, exactly as reading the venue returns it, so the venue retired is the one you meant; any other name is refused and changes nothing. Retiring revokes every Venue key the venue holds, the one you call with among them, revokes its provider connections and retires its routes. Every account it holds is halted, so it takes no new exposure, and leaves its trader’s account list and Connect, with its history kept. The venue leaves your organization’s list of venues and Connect’s tiles. Read by its id, it answers with state retired, and every other write to it is refused with 409 venue_retired. There’s no way back. In production it’s refused until every account the venue holds is flat and settled and holds none of its trader’s money. In the sandbox it retires whatever its test accounts hold, and a position one of them holds stays open on the halted account. The response is the retired venue and what the retirement ended; a retry with the same Idempotency-Key and body answers the same, even with the Venue key the retirement revoked. Required scope: venue:configure. Preview: served on the sandbox to every venue, and production availability is arranged when a venue qualifies. Trading API keys and pre-registration keys do not authorize these routes.
const res = await fetch('https://app.trdrs.co/api/venues/{venueId}/retire', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_VENUE_KEY}`,
"Idempotency-Key": "example-request-1",
},
body: JSON.stringify({
"confirmName": "Example venue"
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/venues/{venueId}/retire' \
-H "Authorization: Bearer $TRDRS_VENUE_KEY" \
-H 'Idempotency-Key: example-request-1' \
-H 'content-type: application/json' \
-d '{"confirmName":"Example venue"}'import requests
url = "https://app.trdrs.co/api/venues/{venueId}/retire"
payload = { "confirmName": "Example venue" }
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/venues/{venueId}/retire",
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([
'confirmName' => 'Example venue'
]),
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/venues/{venueId}/retire"
payload := strings.NewReader("{\n \"confirmName\": \"Example venue\"\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/venues/{venueId}/retire")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"confirmName\": \"Example venue\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/venues/{venueId}/retire")
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 \"confirmName\": \"Example venue\"\n}"
response = http.request(request)
puts response.read_body{
"venue": {
"id": "00000000-0000-0000-0000-000000000001",
"organizationId": "00000000-0000-0000-0000-000000000001",
"name": "Example venue",
"environment": "sandbox",
"state": "retired",
"version": 3,
"createdAt": "2026-09-14T12:00:00.000Z",
"rules": {
"applies": {
"orders": true,
"fills": true,
"stages": true
},
"appliesAtProvider": {
"orders": false,
"fills": false,
"stages": false
}
},
"company": null
},
"retirement": {
"retiredAt": "2026-10-26T12:00:00.000Z",
"accounts": 12,
"keys": 2,
"connections": 1,
"routes": 1
}
}{
"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. It works on the /api/venues/{venueId} routes and, with trader:read or trader:trade, on the account, market and trading routes, reading the venue's own traders' accounts and routing their orders, each request naming its trader in x-trdrs-trader. A trdrs_sk_… key can't be used in its place. It reaches its venue's routes and its venue's own traders, and the owner manages keys from a signed-in session. 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 - 128Path Parameters
Body
The venue's current name, exactly, as typed confirmation that this is the venue to retire.
200