API reference
Every HTTP contract Rubi ships with. Call the Rubi API to run interviews. Implement Own tech, or connect Axcera, so Rubi can read the trading book.
https://api.rubikyt.com. Interviews, traders, webhooks, API keys and integrations.Own techYou implement six read only routes on your platform. Field by field, including the live check. Start here if you do not run Axcera.AxceraRubi calls the Axcera Open API. Paths, query parameters and every field the connector reads.Rubi API#
Base URL https://api.rubikyt.com. Send Authorization: Bearer rubi_live_... and Content-Type: application/json on requests with a body. Responses are snake_case JSON. Timestamps are RFC 3339 UTC. List routes take page (1 based) and limit (default 25, maximum 100) and return { data, meta: { page, limit, total } }.
Errors are application/problem+json: type, title, status, detail, code, and errors on validation failures. See Errors, Authentication and Rate limits (600 requests per minute per key).
Interviews
Full objects, the report schema and examples are on the Interviews API.
| Method | Path | Scope | |
|---|---|---|---|
| GET | /v1/interviews | interviews:read | List with filters and organization KPIs. |
| POST | /v1/interviews | interviews:create | Create an interview. Returns the invite URL once. |
| GET | /v1/interviews/{id} | interviews:read | Interview, report, transcript, integrity events, activity. |
| DELETE | /v1/interviews/{id} | interviews:delete | Delete the interview, media and transcript. 204. |
| POST | /v1/interviews/{id}/decision | interviews:decide | Record approved, rejected or needs_review. |
| POST | /v1/interviews/{id}/share | interviews:read | Create a read only share link. Body expires_hours. |
| DELETE | /v1/interviews/{id}/share | interviews:read | Revoke the share link. |
| POST | /v1/interviews/{id}/reissue | interviews:create | Fresh invite before the trader starts. Optional window_hours. |
| POST | /v1/interviews/{id}/retake | interviews:create | New interview for the same trader. |
| POST | /v1/interviews/{id}/regenerate | interviews:create | Queue a new report. |
| POST | /v1/interviews/{id}/playback | interviews:read | Short lived signed HLS URLs. Refresh before expiry. |
| GET | /v1/interviews/{id}/subtitles | interviews:read | WebVTT captions. 404 until they exist. |
| POST | /v1/interviews/{id}/subtitles | interviews:create | Queue caption generation. |
| POST | /v1/interviews/{id}/activity-file | interviews:create | Multipart CSV or XLSX when no connector covers the account. |
| GET | /v1/interviews/{id}/activity-file | interviews:read | Download the uploaded activity file. |
| POST | /v1/interviews/{id}/assign | interviews:decide | Body user_id, or null to unassign. |
| PATCH | /v1/interviews/{id}/communication | interviews:decide | Body { done: true } after you told the trader the outcome. |
Traders
Field reference on the Traders API. Synced traders from Own tech or Axcera appear here with source set to custom_api or axcera.
| Method | Path | Scope | |
|---|---|---|---|
| GET | /v1/traders | traders:read | Paginated list. Filter with search. |
| POST | /v1/traders | traders:write | Create a trader: full_name, optional email, external_id, country, phone, tags. |
| GET | /v1/traders/{id} | traders:read | Profile, accounts, payouts, notes, interviews, stats. |
| PATCH | /v1/traders/{id} | traders:write | Update identity fields or status. |
| GET | /v1/traders/{id}/trades | traders:read | Paginated trades for one trader. |
| POST | /v1/traders/{id}/notes | traders:write | Body { body }. Internal note. |
| DELETE | /v1/traders/{id}/notes/{noteId} | traders:write | Delete a note. |
Webhooks
Event payloads, signature verification and retries are on Webhooks.
| Method | Path | Scope | |
|---|---|---|---|
| GET | /v1/webhooks | webhooks:manage | List endpoints. |
| GET | /v1/webhooks/events | webhooks:manage | Event catalog with descriptions. |
| POST | /v1/webhooks | webhooks:manage | Create. Body url and events. Returns the signing secret once. |
| PATCH | /v1/webhooks/{id} | webhooks:manage | Update url, events or is_active. |
| DELETE | /v1/webhooks/{id} | webhooks:manage | Delete an endpoint. |
| POST | /v1/webhooks/{id}/test | webhooks:manage | Send a ping delivery. |
| POST | /v1/webhooks/{id}/rotate-secret | webhooks:manage | Rotate the signing secret. Shown once. |
| GET | /v1/webhooks/{id}/deliveries | webhooks:manage | Delivery history, paginated. |
| POST | /v1/webhooks/deliveries/{deliveryId}/retry | webhooks:manage | Retry one delivery. |
API keys
GET/v1/api-keysapi_keys:manage
Returns { data: ApiKey[] }
Keys without the secret. Each row has id, name, prefix, scopes, created_by_name, created_at, last_used_at, expires_at and revoked_at.
POST/v1/api-keysapi_keys:manage
Returns ApiKeyCreated
| Field | Type | Description |
|---|---|---|
name | string | Required. A label for the dashboard. |
scopes | Permission[] | Required. At least one scope. Unknown scopes are rejected. |
expires_in_days | number | null | Optional expiry. Omit for a key that does not expire. |
The response includes secret, shown once, prefixed with rubi_live_.
curl https://api.rubikyt.com/v1/api-keys \
-H "Authorization: Bearer $RUBI_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Risk pipeline", "scopes": ["interviews:create", "interviews:read", "traders:read"] }'DELETE/v1/api-keys/{id}api_keys:manage
Revokes the key immediately. In flight requests fail with 401.
Integrations#
Connect Axcera or Own tech from the API. kind is axcera or custom_api. Creating an integration runs the live check and returns it as report. Polling starts only when report.ok is true.
GET/v1/integrations/egressintegrations:read
Returns EgressInfo
region, cidrs and a note. Allowlist these ranges on Axcera or on your Own tech API before running the check.
POST/v1/integrations/testintegrations:manage
Returns ConnectionReport
Runs the live check without saving. Same body as create.
POST/v1/integrationsintegrations:manage
Returns IntegrationCreated
| Field | Type | Description |
|---|---|---|
kind | axcera | custom_api | Required. custom_api is Own tech. |
base_url | string | Required. Axcera Open API origin, or your Own tech base URL. HTTPS, no trailing slash. |
api_key | string | Required. Bearer token. Stored encrypted. Only a preview is returned afterwards. |
name | string | null | Label. Defaults from the kind. |
account_scope | object | null | Axcera only. plan_category_ids and platforms. |
sync_interval_seconds | number | null | 60 to 3600. Default 300 (5 minutes). |
curl https://api.rubikyt.com/v1/integrations \
-H "Authorization: Bearer $RUBI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "custom_api",
"name": "Own tech",
"base_url": "https://risk.example-firm.com/rubi/v1",
"api_key": "PROVIDER_KEY",
"sync_interval_seconds": 300
}'curl https://api.rubikyt.com/v1/integrations \
-H "Authorization: Bearer $RUBI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "axcera",
"base_url": "https://openapi.examplefirm.app.axcera.io",
"api_key": "AXCERA_KEY",
"account_scope": { "plan_category_ids": [12], "platforms": ["mt5"] }
}'GET/v1/integrationsintegrations:read
Returns { data: Integration[] }
GET/v1/integrations/{id}integrations:read
Returns Integration
Includes health_status, last_error (code, message, http_status, endpoint, hint), sync timestamps and counters for traders, accounts, trades and payouts.
PATCH/v1/integrations/{id}integrations:manage
Returns Integration
Update name, base_url, api_key, account_scope, sync_interval_seconds or is_active.
DELETE/v1/integrations/{id}integrations:manage
Removes the connection. Synced traders stay in the CRM.
POST/v1/integrations/{id}/testintegrations:manage
Returns ConnectionReport
Re-runs the live check for a saved connection.
POST/v1/integrations/{id}/syncintegrations:manage
Returns { queued: boolean }
Queues a sync immediately, without waiting for the interval.
GET/v1/integrations/{id}/runsintegrations:read
Returns Page of sync runs
Each run has resource, status, records_upserted, error, started_at and finished_at.
Own tech#
Your platform implements these routes. Rubi calls them. The pages linked here document every field, enum, error and the exact assertions of the live check.
| Method | Path | Scope | |
|---|---|---|---|
| GET | /health | Bearer key | status must be ok |
| GET | /traders | Bearer key | id and updated_at required |
| GET | /traders/{id} | Bearer key | one trader, 404 when unknown |
| GET | /accounts | Bearer key | id, trader_id, updated_at required |
| GET | /trades | Bearer key | 90 day backfill, open and closed |
| GET | /payouts | Bearer key | optional, 404 skips payouts |
Axcera#
Rubi calls these routes on https://openapi.<tenant>.app.axcera.io. Field aliases and query parameters are on the Axcera endpoints page. Connecting the key is on the setup guide.
| Method | Path | Scope | |
|---|---|---|---|
| GET | /v1/prop-accounts | Axcera key | Authentication probe, then account sync. Scope filters apply. |
| GET | /v1/customers | Axcera key | Traders, sorted by customerNr. |
| GET | /v1/trades/closed | Axcera key | Closed trades, sorted by closeDate. |
| GET | /v1/trades/open | Axcera key | Open trades, up to 50 pages. Not part of the live check. |
| GET | /v1/payouts | Axcera key | Optional. 404 skips payouts. |