const res = await fetch('https://app.trdrs.co/api/venues/{venueId}/accounts/{accountId}/balance', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_VENUE_KEY}`,
"Idempotency-Key": "example-request-1",
},
body: JSON.stringify({
"op": "debit",
"amount": 800,
"comment": "payout 2026-08-31"
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/venues/{venueId}/accounts/{accountId}/balance' \
-H "Authorization: Bearer $TRDRS_VENUE_KEY" \
-H 'Idempotency-Key: example-request-1' \
-H 'content-type: application/json' \
-d '{"op":"debit","amount":800,"comment":"payout 2026-08-31"}'import requests
url = "https://app.trdrs.co/api/venues/{venueId}/accounts/{accountId}/balance"
payload = {
"op": "debit",
"amount": 800,
"comment": "payout 2026-08-31"
}
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}/accounts/{accountId}/balance",
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([
'op' => 'debit',
'amount' => 800,
'comment' => 'payout 2026-08-31'
]),
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}/accounts/{accountId}/balance"
payload := strings.NewReader("{\n \"op\": \"debit\",\n \"amount\": 800,\n \"comment\": \"payout 2026-08-31\"\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}/accounts/{accountId}/balance")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"op\": \"debit\",\n \"amount\": 800,\n \"comment\": \"payout 2026-08-31\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/venues/{venueId}/accounts/{accountId}/balance")
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 \"op\": \"debit\",\n \"amount\": 800,\n \"comment\": \"payout 2026-08-31\"\n}"
response = http.request(request)
puts response.read_body{
"recorded": true,
"accountId": "example-account",
"op": "debit",
"amount": "800",
"currency": "USD",
"referenceId": "payout-2026-08-31-a"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}{
"error": "invalid_instrument"
}Credit, debit or adjust an account's balance
Credits, debits or adjusts an account’s balance, for a payout, a refund or a correction. The money is recorded in the account currency, apart from trading P&L, and on an account the venue issued a debit can only take money no open position or working order is holding. Trading P&L excludes balance operations. Daily loss references move with transfers; the stage policy chooses whether its maximum-loss reference also moves. The response names what was recorded. Required scope: balance:write. 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}/accounts/{accountId}/balance', {
method: 'POST',
headers: {
'content-type': 'application/json',
Authorization: `Bearer ${process.env.TRDRS_VENUE_KEY}`,
"Idempotency-Key": "example-request-1",
},
body: JSON.stringify({
"op": "debit",
"amount": 800,
"comment": "payout 2026-08-31"
}),
})
const data = await res.json()curl -X POST 'https://app.trdrs.co/api/venues/{venueId}/accounts/{accountId}/balance' \
-H "Authorization: Bearer $TRDRS_VENUE_KEY" \
-H 'Idempotency-Key: example-request-1' \
-H 'content-type: application/json' \
-d '{"op":"debit","amount":800,"comment":"payout 2026-08-31"}'import requests
url = "https://app.trdrs.co/api/venues/{venueId}/accounts/{accountId}/balance"
payload = {
"op": "debit",
"amount": 800,
"comment": "payout 2026-08-31"
}
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}/accounts/{accountId}/balance",
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([
'op' => 'debit',
'amount' => 800,
'comment' => 'payout 2026-08-31'
]),
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}/accounts/{accountId}/balance"
payload := strings.NewReader("{\n \"op\": \"debit\",\n \"amount\": 800,\n \"comment\": \"payout 2026-08-31\"\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}/accounts/{accountId}/balance")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"op\": \"debit\",\n \"amount\": 800,\n \"comment\": \"payout 2026-08-31\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trdrs.co/api/venues/{venueId}/accounts/{accountId}/balance")
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 \"op\": \"debit\",\n \"amount\": 800,\n \"comment\": \"payout 2026-08-31\"\n}"
response = http.request(request)
puts response.read_body{
"recorded": true,
"accountId": "example-account",
"op": "debit",
"amount": "800",
"currency": "USD",
"referenceId": "payout-2026-08-31-a"
}{
"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
Your reference for this operation, 1 to 128 characters. It is recorded before any money moves, so a retry with the same key is refused as duplicate_reference and moves nothing a second time. Read the result by this reference with the balance receipt route, which reads every reference this write accepts.
1 - 128Body
credit adds money, debit takes it away, and adjustment records a correction.
credit, debit, adjustment A positive amount in the account currency, at most 1,000,000,000, with no more decimals than the currency posts in.
An optional note kept with the record, at most 300 characters.
300Response
Success. The response is sent with Cache-Control: no-store, so don't cache it.