curl --request GET \
--url https://api.citadel.example/api/v1/billing/balance \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.citadel.example/api/v1/billing/balance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.citadel.example/api/v1/billing/balance"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.citadel.example/api/v1/billing/balance"
req, _ := http.NewRequest("GET", 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))
}{
"currency": "USDT",
"decimals": 6,
"available": "41250000",
"held": "1200000",
"receivable": "0",
"credit_limit": "0",
"spendable": "41250000",
"open_holds": 3
}Get the billing balance
Your organization’s prepaid balance for paid workflow steps — TRON energy and bandwidth,
account activation, compliance screening — in micro-USDT (decimals: 6), as integer
strings. A paid step holds its estimated price before it asks the provider and settles to
the actual price after; when spendable cannot cover the hold, the step does not run and
the workflow follows its “unavailable” rule.
available is the balance; held what running steps hold; receivable what a provider
charged beyond what the balance could cover, which your next top-up pays first;
credit_limit how far below zero available may go (0 — prepaid); spendable
what a new hold may still take, available + credit_limit. open_holds counts the steps
still holding.
One balance for the organization: it takes no network. Needs the read scope.
curl --request GET \
--url https://api.citadel.example/api/v1/billing/balance \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.citadel.example/api/v1/billing/balance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.citadel.example/api/v1/billing/balance"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.citadel.example/api/v1/billing/balance"
req, _ := http.NewRequest("GET", 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))
}{
"currency": "USDT",
"decimals": 6,
"available": "41250000",
"held": "1200000",
"receivable": "0",
"credit_limit": "0",
"spendable": "41250000",
"open_holds": 3
}Authorizations
An API key minted in the console (ctd_…). Authenticates; never authorizes funds. A key
carries scopes (read, wallets.write, transactions.write, events.write,
webhooks.write, policy.write) and may be limited to vaults, to IP addresses, and in
lifetime — see Authentication.
Response
The balance.
USDT 6: every amount is in micro-USDT.
The balance; below 0 only within credit_limit.
What paid steps still running hold.
What a provider charged beyond what the balance covered; your next top-up pays it first.
How far below zero available may go; 0 — prepaid.
What a new hold may still take: available + credit_limit, never below 0.
Paid steps still holding.