curl --request GET \
--url https://api.citadel.example/api/v1/transactions \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.citadel.example/api/v1/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.citadel.example/api/v1/transactions"
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/transactions"
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))
}{
"data": [
{
"operation_id": "0199a3c4-8a00-7c22-8d3e-4f5a6b7c8d9e",
"status": "confirmed",
"network": "mainnet",
"chain": "tron",
"wallet": {
"id": "0199a3b1-5e20-7d41-9c3a-2b4c6d8e0f12",
"reference": "hot-1",
"address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"
},
"actions": [
{
"type": "transfer",
"to": "TC6A9sQD2tCSaR1wcBXZtrvGkFyoLgRHHF",
"amount": "50000000",
"asset": "USDT",
"contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"decimals": 6
}
],
"end_user_ref": "user-4211",
"tags": [],
"tx_hash": "9f1c2e…",
"fee": {
"amount": "1100000",
"asset": "TRX",
"decimals": 6
},
"idempotency_key": "payout-981",
"created_at": "2026-10-08T12:00:00Z",
"updated_at": "2026-10-08T12:01:10Z"
}
],
"next_cursor": "WyIyMDI2LTEwLTA4VDEyOjAwOjAwLjAwMDAwMFoiLCIwMTk5YTNjNC04YTAwLTdjMjItOGQzZS00ZjVhNmI3YzhkOWUiXQ"
}List transactions
The transactions you sent with POST /transactions on one network, newest first, queued
ones included. Each row is the body GET /transactions/{id} reads. Use it to reconcile
your payouts, or to catch up after missed operation.* webhooks.
Only what your API keys submitted is listed. Transactions Citadel makes for itself (network
fee top-ups, sweeps between your wallets, energy) are not, nor are the ones a workflow
sends: those are on the workflow’s run (GET /runs/{id}, the run.* webhooks).
network is required. Paged with a cursor — see Lists and pagination. Needs the read
scope. A key limited to vaults lists the transactions of wallets in them.
curl --request GET \
--url https://api.citadel.example/api/v1/transactions \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.citadel.example/api/v1/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.citadel.example/api/v1/transactions"
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/transactions"
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))
}{
"data": [
{
"operation_id": "0199a3c4-8a00-7c22-8d3e-4f5a6b7c8d9e",
"status": "confirmed",
"network": "mainnet",
"chain": "tron",
"wallet": {
"id": "0199a3b1-5e20-7d41-9c3a-2b4c6d8e0f12",
"reference": "hot-1",
"address": "TQn9Y2khEsLJW1ChVWFMSMeRDow5KcbLSE"
},
"actions": [
{
"type": "transfer",
"to": "TC6A9sQD2tCSaR1wcBXZtrvGkFyoLgRHHF",
"amount": "50000000",
"asset": "USDT",
"contract": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
"decimals": 6
}
],
"end_user_ref": "user-4211",
"tags": [],
"tx_hash": "9f1c2e…",
"fee": {
"amount": "1100000",
"asset": "TRX",
"decimals": 6
},
"idempotency_key": "payout-981",
"created_at": "2026-10-08T12:00:00Z",
"updated_at": "2026-10-08T12:01:10Z"
}
],
"next_cursor": "WyIyMDI2LTEwLTA4VDEyOjAwOjAwLjAwMDAwMFoiLCIwMTk5YTNjNC04YTAwLTdjMjItOGQzZS00ZjVhNmI3YzhkOWUiXQ"
}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.
Query Parameters
The network the data lives on. Required — there is no default network: without it,
422 network_required. A wallet named by its id on another network: 422 network_mismatch.
The network the data lives on. Required wherever it appears in a request — there is no
default network. One your installation does not serve: 422 network_not_served.
mainnet, testnet One status, or several separated by commas (confirmed,final).
"failed,expired"
Only the transactions from this wallet: your reference on network, or its id. An
unknown wallet, or one outside the key's vaults, answers 404; a wallet id from
another network, 422 network_mismatch.
Only the transactions for this user.
Only the transactions carrying this tag (a queued payout's tags).
Only rows Citadel recorded at this time or later (created_at). An ISO 8601 date-time.
Only rows Citadel recorded before this time (created_at). An ISO 8601 date-time.
Rows per page, 1 to 100. Out of range, 422.
1 <= x <= 100The next_cursor of the page before; absent for the first page. Send the same filters
with it. A cursor this API did not issue answers 422 invalid_cursor.