Account
GET /v1/transactions — Your Balance Ledger
Every movement on your CSBoard balance — purchases, refunds, sales, deposits — newest first, keyset paginated. The endpoint to reconcile against.
GET
/
transactions
Your balance ledger
curl --request GET \
--url https://csboard.com/v1/transactions \
--header 'Authorization: Bearer <token>'import requests
url = "https://csboard.com/v1/transactions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://csboard.com/v1/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://csboard.com/v1/transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://csboard.com/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))
}HttpResponse<String> response = Unirest.get("https://csboard.com/v1/transactions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"type": "purchase",
"amount_usd": -1.28,
"balance_after_usd": 428.18,
"created_at": "2023-11-07T05:31:56Z",
"order_id": "<string>",
"order_kind": "buy"
}
],
"meta": {
"next_cursor": "<string>",
"per_page": 123
}
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}The transactions endpoint is your money ledger: one row per movement on your balance, newest first. It is the endpoint to reconcile against — a failed purchase and the refund that made you whole are two rows carrying the same
order_id.
Authentication required. Send your key as Authorization: Bearer csb_pub_.... Any valid key works; the trading flag is not needed.
A
cancelled or failed order is always refunded, and the credit usually lands within seconds. You do not need to poll this endpoint to find out whether a refund happened — the order itself carries a refund object. Use /v1/transactions when you want the full money trail: bookkeeping, an internal statement, or an end-of-day reconciliation.Query parameters
integer
default:"50"
Results per page. Minimum
1, maximum 100.string
Filter by movement type. One of:
purchase, refund, sale, deposit, withdrawal, bonus, fee.integer
Only return entries created at or after this Unix timestamp (seconds).
integer
Only return entries created at or before this Unix timestamp (seconds).
string
Keyset cursor from a previous response’s
meta.next_cursor. Pass it to fetch the next page.Response fields
Transaction[]
required
Array of ledger entries for this page.
Show Transaction object
Show Transaction object
string
required
Ledger entry id.
string
required
What moved the money. One of:
purchase, refund, sale, deposit, withdrawal, bonus, fee, adjustment.number
required
Signed. Negative means money left your balance, positive means it came in.
number
required
Your balance immediately after this entry.
string | null
The order this movement belongs to.
null for movements that are not tied to an order (a deposit, a bonus).string | null
Whether
order_id refers to a buy or a sell order.datetime
required
ISO 8601 timestamp.
object
required
Example request
curl "https://csboard.com/v1/transactions?type=refund&limit=50" \
-H "Authorization: Bearer csb_pub_..."
Example response
A purchase that could not be delivered, and its refund — sameorder_id, seconds apart:
{
"data": [
{
"id": "tx_01J9Z3M2A7",
"type": "refund",
"amount_usd": 1.28,
"balance_after_usd": 429.46,
"order_id": "cmrkm405x0709yj01b8lmzk62",
"order_kind": "buy",
"created_at": "2026-07-14T12:13:15Z"
},
{
"id": "tx_01J9Z3M1Q4",
"type": "purchase",
"amount_usd": -1.28,
"balance_after_usd": 428.18,
"order_id": "cmrkm405x0709yj01b8lmzk62",
"order_kind": "buy",
"created_at": "2026-07-14T12:13:15Z"
}
],
"meta": { "next_cursor": "eyJ0IjoiMjAyNi0wNy0xNFQxMjoxMzoxNVoifQ==", "per_page": 50 }
}
Reconciling a day
Walk the ledger with the cursor and sum by type — purchases and refunds net out against the orders you know:import requests
HEADERS = {"Authorization": "Bearer csb_pub_..."}
cursor, totals = None, {}
while True:
r = requests.get(
"https://csboard.com/v1/transactions",
params={"limit": 100, "start_unix_time": 1752451200, "cursor": cursor},
headers=HEADERS,
).json()
for tx in r["data"]:
totals[tx["type"]] = round(totals.get(tx["type"], 0) + tx["amount_usd"], 2)
cursor = r["meta"]["next_cursor"]
if not cursor:
break
print(totals) # {'purchase': -524.89, 'refund': 65.09, ...}
Error codes
| HTTP status | Code | Meaning |
|---|---|---|
| 401 | missing_api_key / invalid_api_key | Missing or invalid API key. |
| 422 | invalid_request | Invalid query parameters (unknown type, bad cursor, limit out of range). |
| 429 | rate_limit_exceeded | Too many requests. Back off for the Retry-After header value. |
Authorizations
Send your key as a Bearer token on every request: Authorization: Bearer csb_pub_.... Generate keys in your CSBoard profile.
Query Parameters
Results per page. 1–100. Default 50.
Required range:
1 <= x <= 100Filter by movement type.
Available options:
purchase, refund, sale, deposit, withdrawal, bonus, fee Only entries created at or after this Unix timestamp (seconds).
Only entries created at or before this Unix timestamp (seconds).
Keyset cursor from a previous response's meta.next_cursor.
⌘I
Your balance ledger
curl --request GET \
--url https://csboard.com/v1/transactions \
--header 'Authorization: Bearer <token>'import requests
url = "https://csboard.com/v1/transactions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://csboard.com/v1/transactions', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://csboard.com/v1/transactions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://csboard.com/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))
}HttpResponse<String> response = Unirest.get("https://csboard.com/v1/transactions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/transactions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "<string>",
"type": "purchase",
"amount_usd": -1.28,
"balance_after_usd": 428.18,
"created_at": "2023-11-07T05:31:56Z",
"order_id": "<string>",
"order_kind": "buy"
}
],
"meta": {
"next_cursor": "<string>",
"per_page": 123
}
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}{
"code": "<string>",
"detail": "<string>"
}