Axcera endpoints
Rubi calls the Axcera Open API with your read only key. You do not implement these routes. This page is the exact contract the connector uses, so a failed check can be matched to a path.
Setup, the base URL and the IP allowlist are on the Axcera setup guide. If your firm does not run Axcera, implement Own tech instead.
Request rules#
- Base URL
https://openapi.<tenant>.app.axcera.io. A trailing/v1is stripped, then every path below is appended, so bothhttps://openapi.examplefirm.app.axcera.ioandhttps://openapi.examplefirm.app.axcera.io/v1work. - Header
Authorization: Bearer <api key>andAccept: application/json. The key comes from the Axcera back office and needs read access to customers, accounts, trades and payouts. - Pagination is
page(1 based) andlimit. Rubi requests 100 rows per page. The list is read fromdata(alsoitems,resultsorrecords). The total ismetadata.total_count, withtotal_countat the top level accepted. - The next page is requested while a full page of 100 came back and
page * 100is still below the total. Rubi never writes. - Each call must return JSON within 20 seconds. 429 responses should include
Retry-Afterin seconds. 5xx responses are retried.
plan_category_ids and platforms. Customers and trades are not filtered by that scope.{ "plan_category_ids": [12, 14], "platforms": ["mt5", "ctrader"] }GET/v1/customers
Returns page of customers
Traders. Called first in the live check after authentication, and on every sync.
| Query | Value Rubi sends |
|---|---|
page | 1, then 2, 3, ... |
limit | 100 |
updated_gte | RFC 3339. Omitted on the first backfill. Later, last success minus 10 minutes. |
sort_by | customerNr |
sort_order | asc |
| Field | Type | Description |
|---|---|---|
customerId | string | Primary id. Aliases: customer_id, id. Required. |
email | string | Aliases: emailAddress, email_address, user.email, customer.email, contact.email, billing.email, profile.email. |
firstName, lastName | string | Aliases first_name and last_name. |
country | string | Aliases countryCode, country_code. |
phone | string | Aliases phoneNumber, phone_number. |
kycStatus | string | Alias kyc_status. Stored as returned. |
createdAt | timestamp | Registration time. Aliases created_at, registeredAt. |
updatedAt | timestamp | Alias updated_at. |
customerNr | string | Kept in metadata as customer_nr. |
lastLoginIp | string | Kept in metadata. Aliases lastIp, last_ip, ip. |
GET/v1/prop-accounts
Returns page of prop accounts
Trading accounts. This is also the authentication probe: the live check calls it with limit=1 before the other resources.
| Query | Value Rubi sends |
|---|---|
page, limit | page from 1, limit 100 |
updated_gte | Same overlap rule as customers. Omitted on the first backfill. |
sort_by, sort_order | accountNr, asc |
plan_category_ids | From account scope, comma separated, only when set. |
platforms | From account scope, comma separated, only when set. |
| Field | Type | Description |
|---|---|---|
accountNr | string | Primary id. Aliases account_nr, login, accountId, id. Required. |
customer.customerId | string | Trader id. Aliases customerId, customer_id. |
login | string | Platform login. Falls back to accountNr. |
platform | string | Stored lowercased. |
plan | string | Program name. Aliases plan_name, planCategoryName, plan_category_name. |
phase, status | string | Stored lowercased. |
currency | string | Account currency. |
initialBalance | number | Aliases initial_balance, accountSize, account_size. |
currentBalance | number | Aliases current_balance, balance. |
currentEquity | number | Aliases current_equity, equity. |
createdAt | timestamp | Account start. Aliases created_at, startedAt. |
updatedAt | timestamp | Alias updated_at. |
accountId, planCategoryName, fundedAt, breachedAt | string | Kept in metadata. accountId is stored as axcera_account_id. |
GET/v1/trades/closed
Returns page of closed trades
Closed positions. Rubi does not send updated_gte here. It pages by close time and stops the incremental run when the oldest close time on the page is older than the sync cursor minus 2 hours, or after 5000 pages.
| Query | Value Rubi sends |
|---|---|
page, limit | page from 1, limit 100 |
sort_by | closeDate |
sort_order | asc on the first backfill, desc on incremental syncs |
| Field | Type | Description |
|---|---|---|
ticket | string | Trade id. Aliases id, tradeId, trade_id. Required. |
accountNr | string | Account id. Aliases account_nr, account.accountNr, accountId, account_id, account, propAccountId. Required. |
symbol | string | Alias instrument. Missing symbols are stored as UNKNOWN. |
side | string | Aliases direction, type. sell, short or 1 become sell. Anything else becomes buy. |
lots | number | Aliases lot. If absent, volume or quantity is used only when it is between 0 and 100 exclusive of 0. |
openDate | timestamp | Aliases openTime, open_time, openedAt. |
closeDate | timestamp | Aliases closeTime, close_time, closedAt. |
openPrice, closePrice | number | Aliases open_price, close_price. |
stopLossPrice | number | Aliases sl, stopLoss, stop_loss. |
takeProfitPrice | number | Aliases tp, takeProfit, take_profit. |
commission, swap | number | In account currency. |
pnl | number | Net profit. Aliases profit, netProfit. |
GET/v1/trades/open
Returns page of open trades
Open positions, fetched in full on every sync, up to 50 pages of 100. Close time and close price are ignored. The same trade fields as closed trades are read, with sort_by=ticket and sort_order=asc.
GET/v1/payouts
Returns page of payouts
Optional. A 404 skips payouts and the live check warns instead of failing. Any other error fails the check.
| Query | Value Rubi sends |
|---|---|
page, limit | page from 1, limit 100 |
updated_gte | Same 10 minute overlap as customers. Omitted on the first backfill. |
plan_category_ids, platforms | From account scope, when set. |
| Field | Type | Description |
|---|---|---|
payoutId | string | Primary id. Aliases payout_id, payoutNr, id. Required. |
customer.customerId | string | Trader id. Aliases customerId, customer_id. |
account.accountNr | string | Account id. Aliases accountNr, account_nr, accountId, account_id, account. |
shareAmount | number | Amount stored. Aliases finalAmount, final_amount, requestAmount, amount. |
currency, status | string | Status is stored lowercased. |
requestedAt | timestamp | Aliases requested_at, createdAt, created_at. |
approvedAt | timestamp | Paid time. Aliases approved_at, paidAt, paid_at. |
profitSplit, requestAmount | number | Kept in metadata as profit_split and request_amount. |
Live check order#
| Step | Request | Required |
|---|---|---|
| Authentication | GET /v1/prop-accounts?page=1&limit=1 | yes |
| Traders | GET /v1/customers?page=1&limit=1 | yes |
| Trading accounts | GET /v1/prop-accounts?page=1&limit=1 plus scope | yes |
| Closed trades | GET /v1/trades/closed?page=1&limit=1 | yes |
| Payouts | GET /v1/payouts?page=1&limit=1 plus scope | no, 404 warns |
Open trades are not part of the live check. They are pulled on the first successful sync. A failed authentication skips the remaining probes.