One contract, every language
The same operation has the same name and behaviour in every SDK.
Every official SDK is built from one written contract and tested against the same scenario before release. An operation has one name, spelled in each language's convention, and behaves the same everywhere: the same idempotency, the same retries, the same errors.
| Operation | TypeScript | Python | Rust |
|---|---|---|---|
| Connect an account | connect(input) | connect(platform, login, password, server) | connect(&Connect::new(…)) |
| List accounts | accounts() | accounts() | accounts() |
| Capabilities | capabilities() | capabilities() | capabilities() |
| Summary | summary() | summary() | summary() |
| Positions | positions() | positions() | positions() |
| Working orders | orders() | orders() | orders() |
| Fills | executions({ from, to }) | executions(from_=, to=) | executions(from, to) |
| Quote | quote(symbol) | quote(symbol) | quote(symbol) |
| Candles | candles(symbol, { timeframe }) | candles(symbol, timeframe) | candles(symbol, timeframe, from, to) |
| Instruments | instruments() | instruments() | instruments() |
| Symbols | symbols({ q, all }) | symbols(q=, all=) | symbols(q, all) |
| Resolve a name | resolve(name) | resolve(name) | resolve(name) |
| Pin a mapping | setSymbolOverride(name, s) | set_symbol_override(name, s) | set_symbol_override(name, s) |
| Place | placeOrder(input, key?) | place_order(symbol, side, volume, …) | place_order(&PlaceOrder::…) |
| Check | checkOrder(input) | check_order(…) | check_order(&order) |
| Cancel | cancelOrder(ticket) | cancel_order(ticket) | cancel_order(ticket, key) |
| Move stops | modifyPosition(ticket, changes) | modify_position(ticket, …) | modify_position(ticket, &Modify) |
| Close one | closePosition(ticket, { volume }) | close_position(ticket, volume=) | close_position(ticket, volume, key) |
| Close many | closePositions({ symbol, filter }) | close_positions(symbol=, filter=) | close_positions(&ClosePositions) |
| Stream | watch(id, stream, fn, params) | watch(id, stream, fn, symbol=) | watch(id, stream, symbol, interval) |
What every SDK does for you
- An idempotency key on every call that changes an account, reused across its own retries, so a dropped connection cannot act twice.
- Retries only where they help:
rate_limited,internal,upstream_failedand network failures, at most three attempts with jittered backoff, honouringRetry-After. - One error type with the code, status, message, hint and request ID.
- Unknown response fields ignored, so a newer API never breaks an older SDK.
- Streams that reconnect and re-subscribe on their own, and stop only for a rejected token.