Accounts
One row per trading account. Interviews can focus on a single account, and the activity analysis is computed from the trades on these accounts.
https://risk.example-firm.com/rubi/v1 with no trailing slash. GET /traders is then requested as https://risk.example-firm.com/rubi/v1/traders.Shared rules for authentication, pagination, errors and the live check are on the Own tech overview.
GET/accounts
Returns { data, next_cursor }
Every call, including GET /health, sends Authorization: Bearer <api key> and Accept: application/json. The key is the secret you paste in the dashboard. Rubi never sends a body: every endpoint is GET.
| Query | Required | Rules |
|---|---|---|
updated_since | no | RFC 3339. Inclusive lower bound on updated_at. Omitted on the first backfill, which must return every account. |
cursor | no | Opaque cursor from the previous page. |
limit | no | 1 to 500. Rubi sends 200 during sync and 5 during the live check. |
| Field | Type | Description |
|---|---|---|
id | string | Required. Stable account id, unique in your system. Numbers are accepted. |
trader_id | string | Required. Must equal a trader id from GET /traders. The check fails when this is missing or null. |
updated_at | timestamp | Required. RFC 3339 UTC. |
platform | enum | null | mt4, mt5, ctrader, matchtrader, tradelocker, dxtrade, or other. |
login | string | null | Platform login, shown on the trader profile. |
program | string | null | Challenge or account program name, for example 2 Step 100K. |
phase | enum | null | evaluation, verification, funded, or other. |
status | enum | null | active, passed, breached, closed, or suspended. |
currency | string | null | ISO 4217, for example USD. |
initial_balance | number | null | Starting balance of the account. |
balance | number | null | Current balance in account currency. |
equity | number | null | Current equity, including open profit. |
started_at | timestamp | null | When the account started. |
metadata | object | null | Stored as-is. Server name, group or add-ons belong here. |
Numeric fields may be JSON numbers or numeric strings. A thousands separator comma inside a string is accepted ("101,250.50" becomes 101250.5).
{
"data": [
{
"id": "acc_99812",
"trader_id": "cus_18422",
"platform": "mt5",
"login": "7001234",
"program": "2 Step 100K",
"phase": "evaluation",
"status": "active",
"currency": "USD",
"initial_balance": 100000,
"balance": 101250.5,
"equity": 101190.2,
"started_at": "2026-09-01T00:00:00Z",
"metadata": { "server": "Live-1" },
"updated_at": "2026-09-22T21:00:00Z"
}
],
"next_cursor": null
}Order by updated_at then id, ascending. An account whose trader is not in GET /traders cannot be attached, so sync traders first in your own data and let Rubi poll both. Rubi requests traders, then accounts, then trades.