# Get trading stats of the trader account

`GET /accounts/{accountId}/stats`

Aggregates over the closed positions of the account: win rate, average profit and loss, risk-reward ratio, max drawdown and average holding times.

- Responds with an empty body while the account has no closed positions yet.
- Covers every phase the account has been through, not only the current one.

## Authorization

bearer: http · bearer (required). Personal API key, prefixed with `usk_`.

## Parameters

- path: accountId (string · uuid; required). Trader account identifier. Must belong to the caller.

Type: string · uuid

format: uuid

## Example · cURL

```bash
curl --request GET 'https://api.upscale.trade/accounts/{accountId}/stats' \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_KEY'
```

## Example · JavaScript

```javascript
const response = await fetch("https://api.upscale.trade/accounts/{accountId}/stats", {
  method: "GET",
  headers: {
    "Accept": "application/json",
    "Authorization": "Bearer YOUR_API_KEY"
  },
});
console.log(response.status, await response.text());
```

## Example · Python

```python
import requests

response = requests.request(
    "GET",
    "https://api.upscale.trade/accounts/{accountId}/stats",
    headers={"Accept":"application/json","Authorization":"Bearer YOUR_API_KEY"},
    timeout=30,
)
print(response.status_code, response.text)
```

## Response 200 · AccountTradingStatsResponse

**200** application/json — Response

Body.riskRewardRatio must be array Body.maxDrawdownPercent must be array Body.avgLeverageProfitablePosition must be array

Schema: AccountTradingStatsResponse

Type: object

Required fields: sumPnl, sumFee, sumFunding, profit, positionsCount, profitablePositionsCount, unprofitablePositionsCount, winratePercent, minProfit, minLoss, maxProfit, maxLoss, avgProfit, avgLoss, riskRewardRatio, maxDrawdownPercent, avgLongPositionHoldTime, avgShortPositionHoldTime, avgPositionHoldTime, medianPositionHoldTime, maxProfitablePositionHoldTime, maxUnprofitablePositionHoldTime, medianProfitablePositionHoldTime, medianUnprofitablePositionHoldTime, avgLeverageProfitablePosition, avgLeverageUnprofitablePosition, topMarket, topMarketPercent

Required field types: sumPnl (string · int32; required), sumFee (string · int32; required), sumFunding (string · int32; required), profit (string · int32; required), positionsCount (number; required), profitablePositionsCount (number; required), unprofitablePositionsCount (number; required), winratePercent (number; required), minProfit (string · int32 · nullable; required), minLoss (string · int32 · nullable; required), maxProfit (string · int32 · nullable; required), maxLoss (string · int32 · nullable; required), avgProfit (string · int32 · nullable; required), avgLoss (string · int32 · nullable; required), riskRewardRatio (number[]; required), maxDrawdownPercent (number[]; required), avgLongPositionHoldTime (number[]; required), avgShortPositionHoldTime (number[]; required), avgPositionHoldTime (number[]; required), medianPositionHoldTime (number[]; required), maxProfitablePositionHoldTime (number[]; required), maxUnprofitablePositionHoldTime (number[]; required), medianProfitablePositionHoldTime (number[]; required), medianUnprofitablePositionHoldTime (number[]; required), avgLeverageProfitablePosition (number[]; required), avgLeverageUnprofitablePosition (number[]; required), topMarket (string[]; required), topMarketPercent (number[]; required)

- sumPnl (string · int32; required)

sumPnl example: 1000000000

sumPnl.Type: string · int32

sumPnl.Realised pnl summed over every closed position, fp9 raw, before fees and funding.

sumPnl.format: int32

sumPnl.pattern: ^(?:-?[1-9][0-9]*|0)$

- sumFee (string · int32; required)

sumFee example: 1000000000

sumFee.Type: string · int32

sumFee.Trading fees paid over every closed position, fp9 raw.

sumFee.format: int32

sumFee.pattern: ^(?:-?[1-9][0-9]*|0)$

- sumFunding (string · int32; required)

sumFunding example: 1000000000

sumFunding.Type: string · int32

sumFunding.Funding settled over every closed position, fp9 raw. Positive when the account received more than it paid.

sumFunding.format: int32

sumFunding.pattern: ^(?:-?[1-9][0-9]*|0)$

- profit (string · int32; required)

profit example: 1000000000

profit.Type: string · int32

profit.Net result of the closed positions, fp9 raw: pnl minus fees plus funding. This is what the win rate splits on.

profit.format: int32

profit.pattern: ^(?:-?[1-9][0-9]*|0)$

- positionsCount (number; required)

positionsCount example: 0

positionsCount.Type: number

positionsCount.Number of closed positions the statistics are built from.

- profitablePositionsCount (number; required)

profitablePositionsCount example: 0

profitablePositionsCount.Type: number

profitablePositionsCount.Closed positions that ended at or above break-even.

- unprofitablePositionsCount (number; required)

unprofitablePositionsCount example: 0

unprofitablePositionsCount.Type: number

unprofitablePositionsCount.Closed positions that ended below break-even.

- winratePercent (number; required)

winratePercent example: 62.5

winratePercent.Type: number

winratePercent.Share of closed positions that ended at or above break-even, in percent with two decimals.

- minProfit (string · int32 · nullable; required)

minProfit example: 1000000000

minProfit.Type: string · int32 · nullable

minProfit.Smallest win among profitable positions, fp9 raw. Null when there is none.

minProfit.format: int32

minProfit.pattern: ^(?:-?[1-9][0-9]*|0)$

- minLoss (string · int32 · nullable; required)

minLoss example: 1000000000

minLoss.Type: string · int32 · nullable

minLoss.Smallest loss among losing positions, fp9 raw (negative, closest to zero). Null when there is none.

minLoss.format: int32

minLoss.pattern: ^(?:-?[1-9][0-9]*|0)$

- maxProfit (string · int32 · nullable; required)

maxProfit example: 1000000000

maxProfit.Type: string · int32 · nullable

maxProfit.Largest win, fp9 raw. Null when no position ended in profit.

maxProfit.format: int32

maxProfit.pattern: ^(?:-?[1-9][0-9]*|0)$

- maxLoss (string · int32 · nullable; required)

maxLoss example: 1000000000

maxLoss.Type: string · int32 · nullable

maxLoss.Largest loss, fp9 raw (the most negative value). Null when no position ended in loss.

maxLoss.format: int32

maxLoss.pattern: ^(?:-?[1-9][0-9]*|0)$

- avgProfit (string · int32 · nullable; required)

avgProfit example: 1000000000

avgProfit.Type: string · int32 · nullable

avgProfit.Average win across profitable positions, fp9 raw. Null when there is none.

avgProfit.format: int32

avgProfit.pattern: ^(?:-?[1-9][0-9]*|0)$

- avgLoss (string · int32 · nullable; required)

avgLoss example: 1000000000

avgLoss.Type: string · int32 · nullable

avgLoss.Average loss across losing positions, fp9 raw (negative). Null when there is none.

avgLoss.format: int32

avgLoss.pattern: ^(?:-?[1-9][0-9]*|0)$

- riskRewardRatio (number[]; required)

riskRewardRatio.Type: number[]

riskRewardRatio.Average win over the absolute average loss. Null while no losing position exists to divide by.

riskRewardRatio.[]Type: number

- maxDrawdownPercent (number[]; required)

maxDrawdownPercent.Type: number[]

maxDrawdownPercent.Deepest equity drawdown of the account across all its phases, in percent with two decimals.

maxDrawdownPercent.[]Type: number

- avgLongPositionHoldTime (number[]; required)

avgLongPositionHoldTime example: [
  0
]

avgLongPositionHoldTime.Type: number[]

avgLongPositionHoldTime.Average holding time of long positions, in seconds.

avgLongPositionHoldTime.[]Type: number

- avgShortPositionHoldTime (number[]; required)

avgShortPositionHoldTime example: [
  0
]

avgShortPositionHoldTime.Type: number[]

avgShortPositionHoldTime.Average holding time of short positions, in seconds.

avgShortPositionHoldTime.[]Type: number

- avgPositionHoldTime (number[]; required)

avgPositionHoldTime example: [
  0
]

avgPositionHoldTime.Type: number[]

avgPositionHoldTime.Average holding time across all closed positions, in seconds.

avgPositionHoldTime.[]Type: number

- medianPositionHoldTime (number[]; required)

medianPositionHoldTime example: [
  0
]

medianPositionHoldTime.Type: number[]

medianPositionHoldTime.Median holding time across all closed positions, in seconds.

medianPositionHoldTime.[]Type: number

- maxProfitablePositionHoldTime (number[]; required)

maxProfitablePositionHoldTime example: [
  0
]

maxProfitablePositionHoldTime.Type: number[]

maxProfitablePositionHoldTime.Longest a profitable position was held, in seconds.

maxProfitablePositionHoldTime.[]Type: number

- maxUnprofitablePositionHoldTime (number[]; required)

maxUnprofitablePositionHoldTime example: [
  0
]

maxUnprofitablePositionHoldTime.Type: number[]

maxUnprofitablePositionHoldTime.Longest a losing position was held, in seconds.

maxUnprofitablePositionHoldTime.[]Type: number

- medianProfitablePositionHoldTime (number[]; required)

medianProfitablePositionHoldTime example: [
  0
]

medianProfitablePositionHoldTime.Type: number[]

medianProfitablePositionHoldTime.Median holding time of profitable positions, in seconds.

medianProfitablePositionHoldTime.[]Type: number

- medianUnprofitablePositionHoldTime (number[]; required)

medianUnprofitablePositionHoldTime example: [
  0
]

medianUnprofitablePositionHoldTime.Type: number[]

medianUnprofitablePositionHoldTime.Median holding time of losing positions, in seconds.

medianUnprofitablePositionHoldTime.[]Type: number

- avgLeverageProfitablePosition (number[]; required)

avgLeverageProfitablePosition.Type: number[]

avgLeverageProfitablePosition.Average leverage of profitable positions — notional over margin, as a plain multiple.

avgLeverageProfitablePosition.[]Type: number

- avgLeverageUnprofitablePosition (number[]; required)

avgLeverageUnprofitablePosition.Type: number[]

avgLeverageUnprofitablePosition.Average leverage of losing positions — notional over margin, as a plain multiple.

avgLeverageUnprofitablePosition.[]Type: number

- topMarket (string[]; required)

topMarket.Type: string[]

topMarket.Base asset ticker of the most traded market, by number of closed positions. Null when nothing has been closed.

topMarket.[]Type: string

- topMarketPercent (number[]; required)

topMarketPercent.Type: number[]

topMarketPercent.Share of closed positions that were on `topMarket`, in percent with two decimals.

topMarketPercent.[]Type: number

## Response 401

**401**  — Unauthorized

## Response 403

**403**  — The account belongs to another user (`account_access_denied`), or the request is authenticated with an API key while `api_trading` is disabled on the account (`api_trading_not_enabled`).

## Response 404

**404**  — No account with this identifier.

## Response 429

**429**  — Rate limit of the API key exceeded (`api_key_rate_limit_exceeded`). `Retry-After` says when to come back; the body carries the bucket (`read` / `write`), the window that tripped, its limit and `retryAt`.