# Firm-wide reporting

> Counts, pass rate, net P&L, a leaderboard and a feed of every breach and pass across your whole book.

Source: https://www.propexecutor.com/docs/reporting
Whole reference in one file: https://www.propexecutor.com/doc.md

Firm-wide views. [Analytics](https://www.propexecutor.com/docs/analytics) answers “how is this account doing”; these answer “how is the firm doing” without you fetching every account and aggregating it yourself.

## Overview

`GET /v1/reports/overview` · **Planned** · scope `accounts:read`

<!-- 200 OK -->
```json
{
  "accounts": {
    "total": 1184, "active": 402, "passed": 96,
    "breached": 588, "archived": 98, "unassigned": 41
  },
  "pass_rate": 0.1404,
  "net_realized_pnl": -184203.55,
  "equity_under_management": 4120550.18,
  "traders": 903,
  "credits": { "granted": 1250, "used": 1184, "remaining": 66 }
}
```

| Field | Type | Description |
| --- | --- | --- |
| `pass_rate` | number | Passed over decided (passed + breached). Deliberately excludes accounts still trading — counting those as failures understates it early and overstates it never. |
| `net_realized_pnl` | number | Summed across every account, closed trades only. Negative is the normal state for a challenge book. |
| `equity_under_management` | number | Total live equity across active accounts. Simulated capital, not money you hold. |
| `unassigned` | integer | Provisioned accounts with no trader yet — your unsold inventory. |

> **Watch `credits.remaining` here**
> This is the field worth putting on your own internal dashboard. Running out mid-onboarding means a trader who paid you cannot be given an account until you buy more. See [limits](https://www.propexecutor.com/docs/limits).

## Leaderboard

`GET /v1/reports/leaderboard` · **Planned** · scope `accounts:read`

Accounts ranked by a metric you choose. What most firms put on a public page or a trader-facing widget.

| Field | Type | Description |
| --- | --- | --- |
| `sort` | string | `gain` (default), `profit_factor`, `drawdown` or `net_pnl`. |
| `status` | string | Filter, e.g. `active` or `passed`. Omit for all. |
| `limit` | integer | Default 20, maximum 100. |

> **Do not publish this response as-is**
> It contains `trader_email`. If you are rendering a public leaderboard, map to a display name your trader consented to — an email address is personal data, and publishing one because it happened to be in the payload is the kind of mistake that is hard to undo.

## Decisions feed

`GET /v1/reports/decisions` · **Planned** · scope `accounts:read`

Every breach and pass, newest first, cursor-paginated — with the rule that fired and the equity state at the moment it did. Useful for a daily digest or a back-office queue.

<!-- 200 OK -->
```json
{
  "data": [
    {
      "account": 10000042,
      "trader_id": "3d21…",
      "decision": "breached",
      "reason": "daily drawdown 5.2% exceeded the 5% limit (equity 9480.00, day start 10000.00)",
      "equity": 9480,
      "decided_at": "2026-09-27T14:02:19Z"
    }
  ],
  "next_cursor": null
}
```

> **Prefer webhooks for this**
> Polling this feed to find out about breaches works, but [webhooks](https://www.propexecutor.com/docs/webhooks) tell you within seconds and cost you no rate limit. Use the feed to backfill after an outage, and webhooks for the live path.
