---
title: "Get user trading stats"
method: GET
path: "/v1/stats/user-trading"
tags: ["Stats"]
---

# Get user trading stats

`GET /v1/stats/user-trading`

Get per-wallet trading stats (volume + fees + trade count + last trade timestamp + win rate) within a time range.

## Query parameters

- `address` string, required

## Response `200`

A successful response.

- ApiGetUserTradingStatsResponse
  - `address` string — Wallet address (echoed back).
  - `traded_volume` string — Regular trading volume: non-liquidation matches (limit/market + TPSL).
  - `liquidation_volume` string — Liquidation volume: forcibly-closed positions.
  - `total_volume` string — traded_volume + liquidation_volume.
  - `maker_fee` string — Fees paid on maker-side fills.
  - `taker_fee` string — Fees paid on taker-side fills.
  - `liquidation_fee` string — Penalty fees paid on liquidation.
  - `total_fee` string — maker_fee + taker_fee + liquidation_fee.
  - `trade_count` integer — Lifetime match count: maker + taker participations.
  - `last_trade_at` string, int64 — Unix nanos of the wallet's most recent match across maker + taker sides. 0 when the wallet has never traded — FE renders as "—" or "Never".
  - `win_rate` string — Closed-position win rate, as a decimal string in [0, 1] (e.g. "0.5720" = 57.2%). A "closed position" = a position_records row where pnl_after != pnl_before; a "win" = pnl_after > pnl_before. "0" when the wallet has no closed positions — numeric default, not a sentinel, so FE can always parseFloat without special-casing.

## Other responses

- `default` — An unexpected error response.

---

[API](https://skmtc.net/rise/apis/risex-rest-api.md) · [All operations](https://skmtc.net/rise/apis/risex-rest-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/rise/risex-rest-api/revisions/194af8339c0d/schema)
