API reference

Firm-wide reporting

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

Firm-wide views. 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/overviewPlannedscope · accounts:read
200 OK
{
  "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 }
}
pass_ratenumber
Passed over decided (passed + breached). Deliberately excludes accounts still trading — counting those as failures understates it early and overstates it never.
net_realized_pnlnumber
Summed across every account, closed trades only. Negative is the normal state for a challenge book.
equity_under_managementnumber
Total live equity across active accounts. Simulated capital, not money you hold.
unassignedinteger
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.

Leaderboard

GET/v1/reports/leaderboardPlannedscope · accounts:read

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

sortstring
gain (default), profit_factor, drawdown or net_pnl.
statusstring
Filter, e.g. active or passed. Omit for all.
limitinteger
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/decisionsPlannedscope · 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
{
  "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 tell you within seconds and cost you no rate limit. Use the feed to backfill after an outage, and webhooks for the live path.