Skip to content

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 /v1 is stripped, then every path below is appended, so both https://openapi.examplefirm.app.axcera.io and https://openapi.examplefirm.app.axcera.io/v1 work.
  • Header Authorization: Bearer <api key> and Accept: 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) and limit. Rubi requests 100 rows per page. The list is read from data (also items, results or records). The total is metadata.total_count, with total_count at the top level accepted.
  • The next page is requested while a full page of 100 came back and page * 100 is still below the total. Rubi never writes.
  • Each call must return JSON within 20 seconds. 429 responses should include Retry-After in seconds. 5xx responses are retried.
Account scope
Optional JSON saved on the connection is sent as comma separated query parameters on accounts and payouts only: plan_category_ids and platforms. Customers and trades are not filtered by that scope.
account 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.

QueryValue Rubi sends
page1, then 2, 3, ...
limit100
updated_gteRFC 3339. Omitted on the first backfill. Later, last success minus 10 minutes.
sort_bycustomerNr
sort_orderasc
FieldTypeDescription
customerIdstringPrimary id. Aliases: customer_id, id. Required.
emailstringAliases: emailAddress, email_address, user.email, customer.email, contact.email, billing.email, profile.email.
firstName, lastNamestringAliases first_name and last_name.
countrystringAliases countryCode, country_code.
phonestringAliases phoneNumber, phone_number.
kycStatusstringAlias kyc_status. Stored as returned.
createdAttimestampRegistration time. Aliases created_at, registeredAt.
updatedAttimestampAlias updated_at.
customerNrstringKept in metadata as customer_nr.
lastLoginIpstringKept 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.

QueryValue Rubi sends
page, limitpage from 1, limit 100
updated_gteSame overlap rule as customers. Omitted on the first backfill.
sort_by, sort_orderaccountNr, asc
plan_category_idsFrom account scope, comma separated, only when set.
platformsFrom account scope, comma separated, only when set.
FieldTypeDescription
accountNrstringPrimary id. Aliases account_nr, login, accountId, id. Required.
customer.customerIdstringTrader id. Aliases customerId, customer_id.
loginstringPlatform login. Falls back to accountNr.
platformstringStored lowercased.
planstringProgram name. Aliases plan_name, planCategoryName, plan_category_name.
phase, statusstringStored lowercased.
currencystringAccount currency.
initialBalancenumberAliases initial_balance, accountSize, account_size.
currentBalancenumberAliases current_balance, balance.
currentEquitynumberAliases current_equity, equity.
createdAttimestampAccount start. Aliases created_at, startedAt.
updatedAttimestampAlias updated_at.
accountId, planCategoryName, fundedAt, breachedAtstringKept 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.

QueryValue Rubi sends
page, limitpage from 1, limit 100
sort_bycloseDate
sort_orderasc on the first backfill, desc on incremental syncs
FieldTypeDescription
ticketstringTrade id. Aliases id, tradeId, trade_id. Required.
accountNrstringAccount id. Aliases account_nr, account.accountNr, accountId, account_id, account, propAccountId. Required.
symbolstringAlias instrument. Missing symbols are stored as UNKNOWN.
sidestringAliases direction, type. sell, short or 1 become sell. Anything else becomes buy.
lotsnumberAliases lot. If absent, volume or quantity is used only when it is between 0 and 100 exclusive of 0.
openDatetimestampAliases openTime, open_time, openedAt.
closeDatetimestampAliases closeTime, close_time, closedAt.
openPrice, closePricenumberAliases open_price, close_price.
stopLossPricenumberAliases sl, stopLoss, stop_loss.
takeProfitPricenumberAliases tp, takeProfit, take_profit.
commission, swapnumberIn account currency.
pnlnumberNet 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.

QueryValue Rubi sends
page, limitpage from 1, limit 100
updated_gteSame 10 minute overlap as customers. Omitted on the first backfill.
plan_category_ids, platformsFrom account scope, when set.
FieldTypeDescription
payoutIdstringPrimary id. Aliases payout_id, payoutNr, id. Required.
customer.customerIdstringTrader id. Aliases customerId, customer_id.
account.accountNrstringAccount id. Aliases accountNr, account_nr, accountId, account_id, account.
shareAmountnumberAmount stored. Aliases finalAmount, final_amount, requestAmount, amount.
currency, statusstringStatus is stored lowercased.
requestedAttimestampAliases requested_at, createdAt, created_at.
approvedAttimestampPaid time. Aliases approved_at, paidAt, paid_at.
profitSplit, requestAmountnumberKept in metadata as profit_split and request_amount.

Live check order#

StepRequestRequired
AuthenticationGET /v1/prop-accounts?page=1&limit=1yes
TradersGET /v1/customers?page=1&limit=1yes
Trading accountsGET /v1/prop-accounts?page=1&limit=1 plus scopeyes
Closed tradesGET /v1/trades/closed?page=1&limit=1yes
PayoutsGET /v1/payouts?page=1&limit=1 plus scopeno, 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.