curl --request GET \
--url https://api.qbank.cl/platform/v1/balances/history \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.qbank.cl/platform/v1/balances/history"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.qbank.cl/platform/v1/balances/history', 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://api.qbank.cl/platform/v1/balances/history",
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://api.qbank.cl/platform/v1/balances/history"
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://api.qbank.cl/platform/v1/balances/history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qbank.cl/platform/v1/balances/history")
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{
"account_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"from": "2026-06-12",
"to": "2026-07-11",
"granularity": "day",
"timezone": "America/New_York",
"assets": {
"USDT": {
"series": [
{
"date": "2026-06-12",
"balance": "100.000000"
},
{
"date": "2026-06-13",
"balance": "100.000000"
},
{
"date": "2026-07-11",
"balance": "125.430000"
}
],
"first": "100.000000",
"last": "125.430000",
"change_pct": "25.43"
},
"BTC": {
"series": [
{
"date": "2026-06-12",
"balance": "0.00060000"
},
{
"date": "2026-07-11",
"balance": "0.00060000"
}
],
"first": "0.00060000",
"last": "0.00060000",
"change_pct": "0.00"
},
"BANK_USD": {
"series": [
{
"date": "2026-06-12",
"balance": "1500.00"
},
{
"date": "2026-07-11",
"balance": "1725.50"
}
],
"first": "1500.00",
"last": "1725.50",
"change_pct": "15.03"
}
},
"total_usd": {
"series": [
{
"date": "2026-06-12",
"balance_usd": "163.73"
},
{
"date": "2026-07-11",
"balance_usd": "191.34"
}
],
"first": "163.73",
"last": "191.34",
"change_pct": "16.86",
"spot_priced_dates": [],
"unpriced_assets": []
},
"period": {
"in_usd": "280.20",
"out_usd": "254.77",
"net_usd": "25.43"
},
"current": {
"items": [
{
"asset": "USDT",
"available": "125.430000",
"held": "10.000000",
"usd_estimate": "135.43"
},
{
"asset": "USDC",
"available": "0.000000",
"held": "0.000000",
"usd_estimate": "0.00"
},
{
"asset": "BTC",
"available": "0.00060000",
"held": "0.00000000",
"usd_estimate": "65.91"
},
{
"asset": "GOLD",
"available": "0.000000",
"held": "0.000000",
"usd_estimate": "0.00"
}
],
"net_worth_usd_estimate": "201.34"
}
}{
"error": "invalid_range",
"message": "from and to are required (YYYY-MM-DD)"
}{
"error": "unauthorized",
"message": "invalid or missing credentials"
}{
"error": "account_required",
"message": "this endpoint requires an account credential"
}Get balance history
Daily evolution of the account’s balances for dashboard charts: one series per asset (the closing available balance of each day, carried forward on days without movements) plus an aggregated USD series that values every balance at each day’s historical reference price (USDT/USDC at par; BTC/GOLD/SILVER/PLATINUM and USD/BOB/MXN/ARS at the day’s price). Includes the period’s total inflows/outflows and the current snapshot (available + held), so a front can render a Mercury-style balance card with its percentage change. The series tracks the available balance (holds have no history); current carries today’s held per asset. Days valued with today’s spot price (before historical prices exist) are disclosed in spot_priced_dates — values are never invented.
The assets map also includes the banking account mirrors (BANK_USD, BANK_EUR) as their own series in their own currency (2 decimals). They are not part of the total_usd aggregate, which covers all ten ledger balances (USD, USDT, USDC, BTC, GOLD, SILVER, PLATINUM, BOB, MXN, ARS).
curl --request GET \
--url https://api.qbank.cl/platform/v1/balances/history \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.qbank.cl/platform/v1/balances/history"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.qbank.cl/platform/v1/balances/history', 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://api.qbank.cl/platform/v1/balances/history",
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://api.qbank.cl/platform/v1/balances/history"
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://api.qbank.cl/platform/v1/balances/history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.qbank.cl/platform/v1/balances/history")
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{
"account_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"from": "2026-06-12",
"to": "2026-07-11",
"granularity": "day",
"timezone": "America/New_York",
"assets": {
"USDT": {
"series": [
{
"date": "2026-06-12",
"balance": "100.000000"
},
{
"date": "2026-06-13",
"balance": "100.000000"
},
{
"date": "2026-07-11",
"balance": "125.430000"
}
],
"first": "100.000000",
"last": "125.430000",
"change_pct": "25.43"
},
"BTC": {
"series": [
{
"date": "2026-06-12",
"balance": "0.00060000"
},
{
"date": "2026-07-11",
"balance": "0.00060000"
}
],
"first": "0.00060000",
"last": "0.00060000",
"change_pct": "0.00"
},
"BANK_USD": {
"series": [
{
"date": "2026-06-12",
"balance": "1500.00"
},
{
"date": "2026-07-11",
"balance": "1725.50"
}
],
"first": "1500.00",
"last": "1725.50",
"change_pct": "15.03"
}
},
"total_usd": {
"series": [
{
"date": "2026-06-12",
"balance_usd": "163.73"
},
{
"date": "2026-07-11",
"balance_usd": "191.34"
}
],
"first": "163.73",
"last": "191.34",
"change_pct": "16.86",
"spot_priced_dates": [],
"unpriced_assets": []
},
"period": {
"in_usd": "280.20",
"out_usd": "254.77",
"net_usd": "25.43"
},
"current": {
"items": [
{
"asset": "USDT",
"available": "125.430000",
"held": "10.000000",
"usd_estimate": "135.43"
},
{
"asset": "USDC",
"available": "0.000000",
"held": "0.000000",
"usd_estimate": "0.00"
},
{
"asset": "BTC",
"available": "0.00060000",
"held": "0.00000000",
"usd_estimate": "65.91"
},
{
"asset": "GOLD",
"available": "0.000000",
"held": "0.000000",
"usd_estimate": "0.00"
}
],
"net_worth_usd_estimate": "201.34"
}
}{
"error": "invalid_range",
"message": "from and to are required (YYYY-MM-DD)"
}{
"error": "unauthorized",
"message": "invalid or missing credentials"
}{
"error": "account_required",
"message": "this endpoint requires an account credential"
}Authorizations
Session JWT (from register/login) or API key (pk_...).
X-API-Key: <token> is accepted as an alternative header.
Query Parameters
Start date (YYYY-MM-DD, organization timezone, inclusive).
End date (YYYY-MM-DD, organization timezone, inclusive). Max range 366 days.
Response
Daily balance series per asset plus USD aggregate.
"day"
"America/New_York"
One daily closing-balance series per asset. Includes the ten ledger balances (USD, USDT, USDC, BTC, GOLD, SILVER, PLATINUM, BOB, MXN, ARS) and the banking account mirrors (BANK_USD, BANK_EUR) in their own currency; the banking series are excluded from total_usd.
Show child attributes
Show child attributes
Aggregated USD value of all balances per day.
Show child attributes
Show child attributes
Total inflows/outflows of the period in USD.
Show child attributes
Show child attributes
Current snapshot (available + held, valued at spot).
Show child attributes
Show child attributes