Payouts
Requested and paid withdrawals. Rubi shows them on the trader profile and in the report. This endpoint is the only optional one.
Paths are relative to your base URL
Rubi joins the base URL saved under Integrations with the path on this page. Save 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/payouts
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 | Inclusive lower bound on updated_at. Omitted on the first backfill. |
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 when you expose payouts. Stable payout id. |
trader_id | string | Required. The trader who requested the payout. |
status | enum | Required. pending, approved, paid, rejected, or cancelled. |
updated_at | timestamp | Required. Bump it on every status change. |
account_id | string | null | The account the payout was taken from, when you know it. |
amount | number | null | Amount in currency. Use the amount the trader receives. |
currency | string | null | ISO 4217. |
requested_at | timestamp | null | When the trader asked. |
paid_at | timestamp | null | When the money left. Null until status is paid. |
200 response
{
"data": [
{
"id": "pay_7781",
"trader_id": "cus_18422",
"account_id": "acc_99812",
"amount": 4200,
"currency": "USD",
"status": "paid",
"requested_at": "2026-09-10T10:00:00Z",
"paid_at": "2026-09-12T16:30:00Z",
"updated_at": "2026-09-12T16:30:00Z"
}
],
"next_cursor": null
}Skipping payouts#
If your platform has no payout ledger, answer 404 on GET /payouts. Rubi records a warning on the live check and does not poll payouts. Any other error fails the check. An empty data array is also valid and means you expose the endpoint but currently have no rows.
404 when you do not track payouts
{ "error": { "code": "not_found", "message": "Payouts are not exposed" } }A 404 later, after payouts had been syncing, stops payout updates. Keep returning 200 once you have shipped the endpoint.