Ledger#
GET https://api.pro.anboto.xyz/api/v2/portfolio/pnl/ledger
Income from the exchange's own history: realized PnL, funding, commissions, rebates and other income, in USD. Signs are from the account's point of view: + is income, − is cost. net is the net realized PnL of futures (Net realized (futures)). Spot income is trading fees only: they are in commission and fee_rebate but not in net, and spot rows (and a spot-only selection's totals) have null realized_pnl, funding, other and net, never 0. coverage gives the ingestion status per account; venues without ingestion are listed there as unsupported and are never reported as zero. Today's figures are provisional. Results are paged: pass next_cursor back as cursor; totals always cover the whole window. ApiKeyAuth required.
Query params#
accounts stringbinance = every account on Binance (main and subaccounts), binance: = the main account only, binance:Sub1 = that subaccount. Omit for every account of the team. At most 20 items. Unlike /api/v2/trading/*, a missing subaccount means all accounts. Sign the raw value, e.g. accounts=binance:,bybit:Sub1.groupBy enumday, symbol, day_symbolsymbol stringmarket enumspot, futureperiod string<N>d, week, month, quarter or year. Default 30d. Ignored when startDate is givenstartDate dateendDate datelimit integercursor stringnext_cursor of the previous pageHeaders#
| Header | ||
|---|---|---|
X-API-KEY |
string | required |
X-TIMESTAMP |
int64 ms | required |
X-SIGN |
string | required |
X-RECV-WINDOW |
int, default 5000 |
Responses#
| 200 | The income ledger |
| 400 | Invalid parameter, |
| 401 | Unauthorized: missing or unknown API key |
| 429 | Rate limit exceeded, retry later |
| 503 | The portfolio service is unavailable, |
Response fields — PortfolioLedgerResponse#
as_of date-time requiredfrom_date date requiredto_date date requiredgroup_by enum requiredrows — day, symbol, day_symbolcurrency string requiredcoverage[].exchange string requiredcoverage[].subaccount string requiredcoverage[].market enum requiredspot, futurecoverage[].status enum requiredcomplete, partial, unsupportedcoverage[].ingested_through date-time requiredcoverage[].reason string requiredtotals.realized_pnl number requiredtotals.funding number requiredtotals.commission number requiredtotals.fee_rebate number requiredtotals.interest number requiredtotals.other number requiredtotals.net number requiredunpriced_assets array[string]rows[].date date requiredrows[].exchange string requiredrows[].subaccount string requiredrows[].symbol string requiredrows[].market enum requiredspot, futurerows[].realized_pnl number requiredrows[].funding number requiredrows[].commission number requiredrows[].fee_rebate number requiredrows[].interest number requiredrows[].other number requiredrows[].net number requirednext_cursor string requiredcursor to read the next page; null on the last pagecurl -X GET "$BASE/api/v2/portfolio/pnl/ledger?accounts=string" \
-H "X-API-KEY: $API_KEY" -H "X-TIMESTAMP: $ts" \
-H "X-SIGN: $sign"
params = {"accounts": ..., "groupBy": ..., "symbol": ..., "market": ..., "period": ..., "startDate": ..., "endDate": ..., "limit": ..., "cursor": ...}
r = requests.get(f"{BASE}/api/v2/portfolio/pnl/ledger",
params=params
headers=signed_headers_query(params))
print(r.json())
let resp = client
.get(format!("{BASE}/api/v2/portfolio/pnl/ledger?accounts=string"))
.headers(signed_headers_query(¶ms))
.send()?;
println!("{}", resp.text()?);
req, _ := http.NewRequest("GET", BASE+"/api/v2/portfolio/pnl/ledger?accounts=string", nil)
for k, v := range signedHeadersQuery(req.URL.Query()) {
req.Header.Set(k, v)
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)
HttpResponse<String> resp = client.send(
signedGet("/api/v2/portfolio/pnl/ledger?accounts=string"),
HttpResponse.BodyHandlers.ofString());
const res = await fetch(`${BASE}/api/v2/portfolio/pnl/ledger?accounts=string`, {
method: "GET",
headers: signedHeadersQuery(params),
});
const data: PortfolioLedgerResponse = await res.json();
val request = signedGet("/api/v2/portfolio/pnl/ledger?accounts=string")
val response = client.send(request, HttpResponse.BodyHandlers.ofString())
println(response.body())
cpr::Response r = cpr::Get(
cpr::Url{BASE + "/api/v2/portfolio/pnl/ledger?accounts=string"},
signedHeadersQuery(params));
std::cout << r.text << std::endl;
const res = await fetch(`${BASE}/api/v2/portfolio/pnl/ledger?accounts=string`, {
method: "GET",
headers: signedHeadersQuery(params),
});
console.log(await res.json());
Response 200
{
"as_of": "string",
"from_date": "string",
"to_date": "string",
"group_by": "day",
"currency": "USD",
"coverage": [
{
"exchange": "string",
"subaccount": "string",
"market": "spot",
"status": "complete",
"ingested_through": "string",
"reason": "string"
}
],
"totals": {
"realized_pnl": 0.0,
"funding": 0.0,
"commission": 0.0,
"fee_rebate": 0.0,
"interest": 0.0,
"other": 0.0,
"net": 0.0
},
"unpriced_assets": [
"string"
],
"rows": [
{
"date": "string",
"exchange": "string",
"subaccount": "string",
"symbol": "string",
"market": "spot",
"realized_pnl": 0.0,
"funding": 0.0,
"commission": 0.0,
"fee_rebate": 0.0,
"interest": 0.0,
"other": 0.0,
"net": 0.0
}
],
"next_cursor": "string"
}