Skip to content

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.

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.

MethodPathScope
GET/v1/interviewsinterviews:readList with filters and organization KPIs.
POST/v1/interviewsinterviews:createCreate an interview. Returns the invite URL once.
GET/v1/interviews/{id}interviews:readInterview, report, transcript, integrity events, activity.
DELETE/v1/interviews/{id}interviews:deleteDelete the interview, media and transcript. 204.
POST/v1/interviews/{id}/decisioninterviews:decideRecord approved, rejected or needs_review.
POST/v1/interviews/{id}/shareinterviews:readCreate a read only share link. Body expires_hours.
DELETE/v1/interviews/{id}/shareinterviews:readRevoke the share link.
POST/v1/interviews/{id}/reissueinterviews:createFresh invite before the trader starts. Optional window_hours.
POST/v1/interviews/{id}/retakeinterviews:createNew interview for the same trader.
POST/v1/interviews/{id}/regenerateinterviews:createQueue a new report.
POST/v1/interviews/{id}/playbackinterviews:readShort lived signed HLS URLs. Refresh before expiry.
GET/v1/interviews/{id}/subtitlesinterviews:readWebVTT captions. 404 until they exist.
POST/v1/interviews/{id}/subtitlesinterviews:createQueue caption generation.
POST/v1/interviews/{id}/activity-fileinterviews:createMultipart CSV or XLSX when no connector covers the account.
GET/v1/interviews/{id}/activity-fileinterviews:readDownload the uploaded activity file.
POST/v1/interviews/{id}/assigninterviews:decideBody user_id, or null to unassign.
PATCH/v1/interviews/{id}/communicationinterviews:decideBody { 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.

MethodPathScope
GET/v1/traderstraders:readPaginated list. Filter with search.
POST/v1/traderstraders:writeCreate a trader: full_name, optional email, external_id, country, phone, tags.
GET/v1/traders/{id}traders:readProfile, accounts, payouts, notes, interviews, stats.
PATCH/v1/traders/{id}traders:writeUpdate identity fields or status.
GET/v1/traders/{id}/tradestraders:readPaginated trades for one trader.
POST/v1/traders/{id}/notestraders:writeBody { body }. Internal note.
DELETE/v1/traders/{id}/notes/{noteId}traders:writeDelete a note.

Webhooks

Event payloads, signature verification and retries are on Webhooks.

MethodPathScope
GET/v1/webhookswebhooks:manageList endpoints.
GET/v1/webhooks/eventswebhooks:manageEvent catalog with descriptions.
POST/v1/webhookswebhooks:manageCreate. Body url and events. Returns the signing secret once.
PATCH/v1/webhooks/{id}webhooks:manageUpdate url, events or is_active.
DELETE/v1/webhooks/{id}webhooks:manageDelete an endpoint.
POST/v1/webhooks/{id}/testwebhooks:manageSend a ping delivery.
POST/v1/webhooks/{id}/rotate-secretwebhooks:manageRotate the signing secret. Shown once.
GET/v1/webhooks/{id}/deliverieswebhooks:manageDelivery history, paginated.
POST/v1/webhooks/deliveries/{deliveryId}/retrywebhooks:manageRetry 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

FieldTypeDescription
namestringRequired. A label for the dashboard.
scopesPermission[]Required. At least one scope. Unknown scopes are rejected.
expires_in_daysnumber | nullOptional expiry. Omit for a key that does not expire.

The response includes secret, shown once, prefixed with rubi_live_.

bash
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

FieldTypeDescription
kindaxcera | custom_apiRequired. custom_api is Own tech.
base_urlstringRequired. Axcera Open API origin, or your Own tech base URL. HTTPS, no trailing slash.
api_keystringRequired. Bearer token. Stored encrypted. Only a preview is returned afterwards.
namestring | nullLabel. Defaults from the kind.
account_scopeobject | nullAxcera only. plan_category_ids and platforms.
sync_interval_secondsnumber | null60 to 3600. Default 300 (5 minutes).
Own tech
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
  }'
Axcera
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.

MethodPathScope
GET/healthBearer keystatus must be ok
GET/tradersBearer keyid and updated_at required
GET/traders/{id}Bearer keyone trader, 404 when unknown
GET/accountsBearer keyid, trader_id, updated_at required
GET/tradesBearer key90 day backfill, open and closed
GET/payoutsBearer keyoptional, 404 skips payouts
Read the Own tech pages before you build
The overview covers authentication, cursor pagination, the 10 minute overlap and the seven live check steps. Each endpoint page has a request and a response you can copy.

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.

MethodPathScope
GET/v1/prop-accountsAxcera keyAuthentication probe, then account sync. Scope filters apply.
GET/v1/customersAxcera keyTraders, sorted by customerNr.
GET/v1/trades/closedAxcera keyClosed trades, sorted by closeDate.
GET/v1/trades/openAxcera keyOpen trades, up to 50 pages. Not part of the live check.
GET/v1/payoutsAxcera keyOptional. 404 skips payouts.