---
title: "Get trader P&L time series"
method: GET
path: "/api/v1/trader/{address}/pnl"
tags: ["Traders"]
---

# Get trader P&L time series

`GET /api/v1/trader/{address}/pnl`

Returns a trader's daily P&L time series and pre-derived stats from the precomputed daily_pnl read model: entries (daily cumulative P&L), period stats (all/90d/30d/7d), monthly aggregation, per-year totals, and the drawdown series. Reads the refreshed read model, not a per-request equity replay. A resolved trader with no daily P&L returns an empty structured object (HTTP 200); an unknown address returns 404. Spans both providers wherever the read model has the trader's series.

## Path parameters

- `address` string, required

## Response `200`

Trader P&L object

- object
  - `object` 'trader_pnl', required
  - `data` TraderPnl, required
    - `id` string, required — Prefixed trader ID (`trd_...`).
    - `entries` object[], required — Daily cumulative-P&L series (oldest-first).
      - `date` string, date, required
      - `markets_traded` integer, nullable
      - `total_volume` number, nullable
      - `cumulative_profit` number, nullable
      - `total_pnl` number, nullable
      - `daily_change` number, required
    - `stats` object, required
      - `all` object, required
        - `current` number, required
        - `change` number, required
        - `change_pct` number, required
        - `best_day` number, required
        - `best_day_date` string, date, nullable
        - `worst_day` number, required
        - `worst_day_date` string, date, nullable
        - `win_days` integer, required
        - `loss_days` integer, required
        - `avg_day` number, required
        - `rebase_anchor` number, required
      - `d90` object, required
        - `current` number, required
        - `change` number, required
        - `change_pct` number, required
        - `best_day` number, required
        - `best_day_date` string, date, nullable
        - `worst_day` number, required
        - `worst_day_date` string, date, nullable
        - `win_days` integer, required
        - `loss_days` integer, required
        - `avg_day` number, required
        - `rebase_anchor` number, required
      - `d30` object, required
        - `current` number, required
        - `change` number, required
        - `change_pct` number, required
        - `best_day` number, required
        - `best_day_date` string, date, nullable
        - `worst_day` number, required
        - `worst_day_date` string, date, nullable
        - `win_days` integer, required
        - `loss_days` integer, required
        - `avg_day` number, required
        - `rebase_anchor` number, required
      - `d7` object, required
        - `current` number, required
        - `change` number, required
        - `change_pct` number, required
        - `best_day` number, required
        - `best_day_date` string, date, nullable
        - `worst_day` number, required
        - `worst_day_date` string, date, nullable
        - `win_days` integer, required
        - `loss_days` integer, required
        - `avg_day` number, required
        - `rebase_anchor` number, required
    - `monthly` object[], required — Per-month P&L aggregation.
      - `year` integer, required
      - `month` integer, required
      - `pnl` number, required
      - `markets_traded` integer, required
    - `year_totals` object[], required — Per-year P&L totals (ascending by year).
      - `year` integer, required
      - `pnl` number, required
    - `drawdown` object[], required — Underwater (drawdown) series.
      - `date` string, date, required
      - `cumulative_profit` number, required
      - `drawdown` number, required
  - `meta` ResponseMeta, required
    - `request_id` string, required — Unique request ID (req_ prefix).
    - `cached` boolean, required
    - `cache_age_s` integer, nullable — Cache age in seconds, null if not cached.

## Other responses

- `304` — Not Modified. Returned when If-None-Match matches the current payload.
- `400` — Invalid request parameter
- `401` — Missing or invalid API key
- `402` — Active Insider subscription required
- `403` — Account access denied
- `404` — Resource not found
- `408` — Request exceeded the server's 30-second transport timeout. The timeout response has an empty body because it is generated before handler-level JSON error shaping.
- `423` — Account is locked
- `429` — Rate limit exceeded (100 req/min; batch endpoints also reserve 100 batch item units/min before execution)
- `503` — Redis-backed authenticated rate limiter unavailable; retry after the per-process outage cooldown

## Changes

- **2026-06-15** `5b6d6ff7692c` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/0xinsider/apis/0xinsider-api/changes/api/v1/trader/:address/pnl/get.md)

---

[API](https://skmtc.dev/0xinsider/apis/0xinsider-api.md) · [All operations](https://skmtc.dev/0xinsider/apis/0xinsider-api/llms.txt) · [OpenAPI document](https://skmtc.dev/0xinsider/apis/0xinsider-api/revisions/137fa0fd3297?raw)
