Reference

Introduction

The Octolit trading platform exposes six integration surfaces. They share one host, one JSON error shape and one way of thinking about keys and scopes.

#The surfaces

#Conventions

Hosthttps://api.your-brand.com stands for the API host of your Octolit installation. Both APIs and the WebSocket live on it; FIX uses the same host on port 5201.
TransportHTTPS only. Requests and responses are application/json, UTF-8. Send Content-Type: application/json on every request with a body.
KeysHeader X-Api-Key (Partner) or X-API-Key (Trading), or Authorization: Bearer <key>. Never put a key in a URL. Authentication →
TimestampsISO 8601 in UTC with microseconds, e.g. 2026-11-11T09:30:00.000000Z. Webhook headers and WebSocket frames use Unix time (seconds or milliseconds, as documented).
Money & pricesDecimal numbers in the account or symbol currency. Order quantity is in lots or units (lots × contract size).
IdsPlatform ids are integers (trading_account_id, position_id). Your ids are strings: external_id (1-191 chars, letters, digits, . _ @ : + -) and client_order_id (1-64 chars, letters, digits, _ - : .).
PagingList endpoints take limit and a cursor or updated_since and answer with next / has_more as documented per endpoint.
ErrorsNon-2xx answers are { "error": { "code", "message", "details" } }. The code is stable; the message is for humans. Errors →
IdempotencyMoney posting needs an idempotency_key; orders need a client_order_id; PUT /users is idempotent by external_id. Retrying is always safe.

#Brand switches

Every surface is optional and switched per brand in the Octolit CRM (Settings › Brand settings). A call to a switched-off surface answers 403 with a code that names the switch:

SwitchOff answersCovers
Partner APIbrand_disabledEvery Partner API call that touches the brand's users
Single sign-onsso_disabledInbound JWT sign-in and outbound login links
Trading webhooksno deliverytrade.*, margin.call, stop.out, demo.first_trade
Money postinginsufficient_scopePOST /users/{external_id}/transactions
Trending instrumentstrending_disabledGET …/trending on both APIs
Trading APIopen_api_disabled (details.reason)Every /api/open/v1 call, the WebSocket and FIX
The whole platform can be paused by its owner (company_inactive) and a brand can be switched off (brand_inactive). Reads and writes both answer 403 then.

#Versioning

Both APIs are at v1 and the version is part of the path. Additive changes (new fields, new events, new optional parameters) ship without a version bump and are listed in the changelog. Your code should ignore unknown JSON fields and unknown webhook event types. Breaking changes would get a new path prefix and a long overlap.

The OpenAPI documents are the contract: download them or fetch the live copy from your host (GET /api/external/v1/openapi.yaml, GET /api/open/v1/openapi.json).