Skip to content

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.

QueryRequiredRules
updated_sincenoInclusive lower bound on updated_at. Omitted on the first backfill.
cursornoOpaque cursor from the previous page.
limitno1 to 500. Rubi sends 200 during sync and 5 during the live check.
FieldTypeDescription
idstringRequired when you expose payouts. Stable payout id.
trader_idstringRequired. The trader who requested the payout.
statusenumRequired. pending, approved, paid, rejected, or cancelled.
updated_attimestampRequired. Bump it on every status change.
account_idstring | nullThe account the payout was taken from, when you know it.
amountnumber | nullAmount in currency. Use the amount the trader receives.
currencystring | nullISO 4217.
requested_attimestamp | nullWhen the trader asked.
paid_attimestamp | nullWhen 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.