# Saxo OpenAPI: limits, auth and errors

Independent and unofficial. Not affiliated with or endorsed by any broker or platform named here. Educational only: nothing here is advice, and nothing here recommends a broker or a trade.

This is the markdown version of https://openbrokerapi.com/brokers/saxo, written from the same records as that page.

Risk warning: CFDs and spread bets are complex instruments and come with a high risk of losing money rapidly due to leverage. You can lose money on these products, and each provider publishes its own loss figure under FCA rules. You should consider whether you understand how they work and whether you can afford to take the high risk of losing your money. Automated and API trading can amplify losses through bugs, connectivity failures and runaway orders.

OAuth 2.0 REST and WebSocket API, with a free simulation environment.

- Kind: Broker API
- Newest reading: 2026-10-12
- Official documentation: [developer.saxo](https://www.developer.saxo/openapi/learn)
- Everything recorded for Saxo OpenAPI, as one JSON file: https://openbrokerapi.com/data/brokers/saxo.json
- Quickstart, key to first call: https://openbrokerapi.com/brokers/saxo/quickstart

## Saxo API rate limits and allowances

One record per limit. The scope is part of the limit: a figure without its scope is not a figure you can pace against.

- Headline limit: 120/min per session, per service group
  - Scope: session
  - Status: verified. Source: [developer.saxo](https://www.developer.saxo/openapi/learn/rate-limiting), checked 2026-09-18.
  - Note: Per session per service group; 1 order per second per session.

[Saxo API rate limits in full](https://openbrokerapi.com/brokers/saxo/rate-limits), with the related error codes.

## Access, authentication and streaming

- How you get a key: Create a developer portal account for SIM (24 hour token or registered app); apply for live app credentials after testing.
  - Status: verified. Source: [Saxo OpenAPI Learn](https://www.developer.saxo/openapi/learn), checked 2026-09-20.
- Who can use it: Direct retail and professional clients may use it for personal use; a live account must be funded before creating a live app. The approval criteria for a retail live environment are unverified: the environments and security pages read on 19 Sep 2026 say live requires permission and testing before deployment but do not state what is required.
  - Status: verified. Source: [Saxo Support: personal use](https://openapi.help.saxo/hc/en-us/articles/4416505486481-Can-I-use-OpenAPI-for-personal-use), checked 2026-09-21.
- Demo: Yes: SIM environment; 24 hour portal tokens work in SIM only.
  - Status: verified. Source: [Saxo Environments](https://www.developer.saxo/openapi/learn/environments), checked 2026-09-20.
- Authentication: OAuth 2.0 authorization code (with or without PKCE); app key and secret for live. Refresh tokens rotate: each is invalidated on use and replaced. Certificate-based auth is for select partners only, not retail.
  - Status: verified. Source: [Saxo OpenAPI Learn](https://www.developer.saxo/openapi/learn), checked 2026-09-20.
- Streaming: WebSocket streaming (SIM and live hosts). The connection allowance and the instrument cap are unverified as of 20 Sep 2026: the streaming pages no longer publish either figure and say only that the number of WebSocket connections depends on the throttling profile assigned to the application.
  - Status: verified. Source: [Saxo Environments](https://www.developer.saxo/openapi/learn/environments), checked 2026-09-21.
- History depth: Chart samples max 1,200 per request; some FX data back to 2002. Trades report takes FromDate and ToDate with no stated limit.
  - Status: verified. Source: [Saxo OpenAPI Support: How many samples can be returned at a time?](https://openapi.help.saxo/hc/en-us/articles/4417065320977-How-many-samples-can-be-returned-at-a-time), checked 2026-09-22.
- Rate limits, as worded: 10,000,000 requests a day per app; 120 a minute per session per service group; 1 order a second per session; a duplicate order inside 15 seconds is rejected with HTTP 409. Read 23 Sep 2026.
  - Status: verified. Source: [Saxo OpenAPI: rate limiting](https://www.developer.saxo/openapi/learn/rate-limiting), checked 2026-09-23.

## Saxo API endpoints

68 documented endpoints. [Grouped by what they do](https://openbrokerapi.com/brokers/saxo/endpoints).

- [GET /chart/v3/charts](https://openbrokerapi.com/brokers/saxo/endpoints/charts): Returns timestamped open, high, low and close samples for one instrument, up to 1,200 samples a call. Horizon sets the bar length in minutes.
- [POST /chart/v3/charts/subscriptions](https://openbrokerapi.com/brokers/saxo/endpoints/charts-subscribe): Sets up a streaming subscription on chart samples and returns the most recent completed ones as a first snapshot.
- [DELETE /chart/v3/charts/subscriptions/{ContextId}/{ReferenceId}](https://openbrokerapi.com/brokers/saxo/endpoints/charts-unsubscribe): Removes one chart subscription, identified by its context and reference ids, and frees what it held on the server.
- [GET /hist/v1/transactions](https://openbrokerapi.com/brokers/saxo/endpoints/hist-transactions): Lists historical transactions, such as trades, within a date range for a client or account. Filter by transaction type, asset type or instrument.
- [GET /hist/v4/performance/summary](https://openbrokerapi.com/brokers/saxo/endpoints/performance-summary): Returns aggregated trade results and performance figures, such as accumulated profit or loss and win fraction, for a client or account over a period.
- [GET /port/v1/accounts](https://openbrokerapi.com/brokers/saxo/endpoints/accounts): Lists the accounts owned by a client. With no ClientKey it answers for the logged in user's own client.
- [GET /port/v1/accounts/{AccountKey}](https://openbrokerapi.com/brokers/saxo/endpoints/account-by-key): Details of one account: its identifiers, type, currency, whether it is active and what it is allowed to trade.
- [GET /port/v1/accounts/me](https://openbrokerapi.com/brokers/saxo/endpoints/accounts-me): Lists every account under the client the logged in user belongs to. Each account carries the AccountKey you pass to price, order and portfolio calls.
- [POST /port/v1/accounts/subscriptions](https://openbrokerapi.com/brokers/saxo/endpoints/accounts-subscribe): Sets up a streaming subscription on a list of accounts and returns a first snapshot of them.
- [GET /port/v1/balances](https://openbrokerapi.com/brokers/saxo/endpoints/balances): Balance figures for a client, an account group or a single account: cash, cash available for trading, collateral and margin.
- [GET /port/v1/balances/marginoverview](https://openbrokerapi.com/brokers/saxo/endpoints/balances-marginoverview): A margin overview for a client, an account group or a single account, returned as a list of groups.
- [GET /port/v1/balances/me](https://openbrokerapi.com/brokers/saxo/endpoints/balances-me): Returns cash, margin and total value for the logged in client, rolled up in the client's currency.
- [POST /port/v1/balances/subscriptions](https://openbrokerapi.com/brokers/saxo/endpoints/balances-subscribe): Sets up a streaming subscription on a balance and returns a first snapshot of it.
- [GET /port/v1/clients/{ClientKey}](https://openbrokerapi.com/brokers/saxo/endpoints/client-by-key): Details of one client by its key: identifiers, default account, default currency and the netting and trading settings that apply.
- [GET /port/v1/clients/me](https://openbrokerapi.com/brokers/saxo/endpoints/clients-me): Returns the client the logged in user belongs to, including ClientKey, default account and default currency. You need the ClientKey for some history and performance calls.
- [GET /port/v1/closedpositions](https://openbrokerapi.com/brokers/saxo/endpoints/closedpositions): Lists closed positions for a client, an account group or an account, chosen by query parameters.
- [GET /port/v1/closedpositions/{ClosedPositionId}](https://openbrokerapi.com/brokers/saxo/endpoints/closedposition-by-id): One closed position by its id.
- [GET /port/v1/closedpositions/me](https://openbrokerapi.com/brokers/saxo/endpoints/closedpositions-me): Lists positions closed for the logged in client, with open and close prices, times and realised profit or loss.
- [POST /port/v1/closedpositions/subscriptions](https://openbrokerapi.com/brokers/saxo/endpoints/closedpositions-subscribe): Sets up a streaming subscription on a list of closed positions and returns a first snapshot of them.
- [GET /port/v1/exposure/currency/me](https://openbrokerapi.com/brokers/saxo/endpoints/exposure-currency-me): The net exposure in each currency for the logged in user's client.
- [GET /port/v1/exposure/fxspot/me](https://openbrokerapi.com/brokers/saxo/endpoints/exposure-fxspot-me): The currency exposure that comes from FX spot positions alone, for the logged in user's client.
- [GET /port/v1/exposure/instruments/me](https://openbrokerapi.com/brokers/saxo/endpoints/exposure-instruments-me): The net exposure in each instrument for the logged in user's client.
- [GET /port/v1/netpositions](https://openbrokerapi.com/brokers/saxo/endpoints/netpositions): Lists net positions for a client, an account group or an account, with filters by instrument. Each can carry its sub positions if you ask for them.
- [GET /port/v1/netpositions/{NetPositionId}](https://openbrokerapi.com/brokers/saxo/endpoints/netposition-by-id): One net position by its id, with static details in NetPositionBase and the live view in NetPositionView.
- [GET /port/v1/netpositions/me](https://openbrokerapi.com/brokers/saxo/endpoints/netpositions-me): Lists positions netted per instrument for the logged in client, with average open price and profit or loss. Add SubPositions to FieldGroups to include the underlying positions.
- [POST /port/v1/netpositions/subscriptions](https://openbrokerapi.com/brokers/saxo/endpoints/netpositions-subscribe): Sets up a streaming subscription on a list of net positions and returns a first snapshot of them.
- [GET /port/v1/orders](https://openbrokerapi.com/brokers/saxo/endpoints/orders): Lists the open orders of a client or an account. By default only working orders are returned.
- [GET /port/v1/orders/{ClientKey}/{OrderId}](https://openbrokerapi.com/brokers/saxo/endpoints/order-by-id): One open order of a client, looked up by the client's key and the order id.
- [GET /port/v1/orders/me](https://openbrokerapi.com/brokers/saxo/endpoints/orders-me): Lists all open (working) orders across every account of the logged in client. Filled or cancelled orders do not appear here.
- [POST /port/v1/orders/subscriptions](https://openbrokerapi.com/brokers/saxo/endpoints/orders-subscribe): Sets up a streaming subscription on a list of open orders and returns a first snapshot of them.
- [GET /port/v1/positions](https://openbrokerapi.com/brokers/saxo/endpoints/positions): Lists open positions for a client, an account group, an account or one net position, chosen by query parameters.
- [GET /port/v1/positions/{PositionId}](https://openbrokerapi.com/brokers/saxo/endpoints/position-by-id): One open position by its id, with opening details in PositionBase and the live view in PositionView.
- [GET /port/v1/positions/me](https://openbrokerapi.com/brokers/saxo/endpoints/positions-me): Lists each open position for the logged in client, with opening details in PositionBase and live price and profit or loss in PositionView.
- [POST /port/v1/positions/subscriptions](https://openbrokerapi.com/brokers/saxo/endpoints/positions-subscribe): Sets up a streaming subscription on a list of positions and returns a first snapshot of them.
- [GET /port/v1/users/me](https://openbrokerapi.com/brokers/saxo/endpoints/users-me): Returns details about the logged in user, such as name, language, time zone and the ClientKey of the owning client. A good first call to check a token works.
- [GET /port/v1/users/me/entitlements](https://openbrokerapi.com/brokers/saxo/endpoints/users-me-entitlements): The market data entitlements held by the logged in user's client, listed per exchange.
- [GET /ref/v1/countries](https://openbrokerapi.com/brokers/saxo/endpoints/ref-countries): The countries Saxo supports, as a list.
- [GET /ref/v1/cultures](https://openbrokerapi.com/brokers/saxo/endpoints/ref-cultures): The cultures Saxo supports for localising a user's preferences, as a list.
- [GET /ref/v1/currencies](https://openbrokerapi.com/brokers/saxo/endpoints/ref-currencies): The currencies Saxo supports, as a list.
- [GET /ref/v1/currencypairs](https://openbrokerapi.com/brokers/saxo/endpoints/ref-currencypairs): The currency pairs Saxo supports, as a list.
- [GET /ref/v1/exchanges](https://openbrokerapi.com/brokers/saxo/endpoints/ref-exchanges): Every exchange Saxo lists, with details of each such as its identifiers, country, currency and sessions.
- [GET /ref/v1/exchanges/{ExchangeId}](https://openbrokerapi.com/brokers/saxo/endpoints/ref-exchange-by-id): Details of one exchange: its identifiers, country, currency, time zone and trading sessions.
- [GET /ref/v1/instruments](https://openbrokerapi.com/brokers/saxo/endpoints/instruments-search): Searches Saxo's instrument universe by keyword, asset type, exchange or Uic and returns summary rows. Use it to find the Uic you need for prices, charts and orders.
- [GET /ref/v1/instruments/details](https://openbrokerapi.com/brokers/saxo/endpoints/instruments-details-list): Detailed reference data for a list of instruments in one call, chosen by Uic and asset type.
- [GET /ref/v1/instruments/details/{Uic}/{AssetType}](https://openbrokerapi.com/brokers/saxo/endpoints/instrument-details): Returns full details for one instrument: symbol, currency, tick size, minimum trade size, exchange and the order types it supports.
- [GET /ref/v1/instruments/tradingschedule/{Uic}/{AssetType}](https://openbrokerapi.com/brokers/saxo/endpoints/instrument-tradingschedule): The trading schedule of one instrument: its sessions and the time zone they are given in.
- [GET /ref/v1/languages](https://openbrokerapi.com/brokers/saxo/endpoints/ref-languages): The languages Saxo supports, as a list.
- [GET /ref/v1/standarddates/forwardtenor/{Uic}](https://openbrokerapi.com/brokers/saxo/endpoints/standarddates-forwardtenor): The standard forward tenor dates for one instrument.
- [GET /ref/v1/timezones](https://openbrokerapi.com/brokers/saxo/endpoints/ref-timezones): The time zones Saxo supports, as a list.
- [GET /root/v1/diagnostics/get](https://openbrokerapi.com/brokers/saxo/endpoints/diagnostics-get): A test call that does nothing but answer. Use it to check that a GET request reaches the gateway.
- [GET /root/v1/features/availability](https://openbrokerapi.com/brokers/saxo/endpoints/features-availability): Which features are currently available, as a list of feature names each with a flag. Saxo marks this call obsolete.
- [GET /root/v1/sessions/capabilities](https://openbrokerapi.com/brokers/saxo/endpoints/sessions-capabilities): What the current session is allowed: its authentication level, data level and trade level.
- [PUT /root/v1/sessions/capabilities](https://openbrokerapi.com/brokers/saxo/endpoints/put-sessions-capabilities): Change the trade level of the current session, which decides whether it can trade on quotes and receive real time data.
- [POST /root/v1/sessions/events/subscriptions](https://openbrokerapi.com/brokers/saxo/endpoints/sessions-events-subscribe): Sets up a streaming subscription on the session's capabilities, so a change in them is pushed to you.
- [GET /root/v1/user](https://openbrokerapi.com/brokers/saxo/endpoints/root-user): The current user's id, client id, roles and the operations the token may perform. Saxo marks this call obsolete.
- [GET /trade/v1/infoprices](https://openbrokerapi.com/brokers/saxo/endpoints/infoprices): Returns a one off price snapshot (bid, ask, mid and delay) for one instrument. For a live feed Saxo offers price subscriptions over the streaming connection instead.
- [GET /trade/v1/infoprices/list](https://openbrokerapi.com/brokers/saxo/endpoints/infoprices-list): Info prices for several instruments of one asset type in a single call. Info prices are for display, not prices you can trade on.
- [POST /trade/v1/infoprices/subscriptions](https://openbrokerapi.com/brokers/saxo/endpoints/infoprices-subscribe): Sets up a streaming subscription on info prices for a list of instruments and returns a first snapshot.
- [GET /trade/v1/messages](https://openbrokerapi.com/brokers/saxo/endpoints/trade-messages): Trade messages for the current user that have not yet been marked as seen.
- [PATCH /trade/v1/positions/{PositionId}](https://openbrokerapi.com/brokers/saxo/endpoints/patch-position): Change a property of an existing position. The documented use is clearing its force open flag so that it can net against an opposite position.
- [POST /trade/v1/prices/subscriptions](https://openbrokerapi.com/brokers/saxo/endpoints/prices-subscribe): Sets up a streaming price subscription on one instrument and returns an initial snapshot. Updates then arrive on your WebSocket connection under the same ContextId and ReferenceId.
- [DELETE /trade/v1/prices/subscriptions/{ContextId}/{ReferenceId}](https://openbrokerapi.com/brokers/saxo/endpoints/prices-unsubscribe): Removes one price subscription from the current streaming session, identified by its context and reference ids.
- [DELETE /trade/v2/orders](https://openbrokerapi.com/brokers/saxo/endpoints/cancel-orders-by-instrument): Cancels every order in one instrument on one account in a single call.
- [PATCH /trade/v2/orders](https://openbrokerapi.com/brokers/saxo/endpoints/change-order): Changes one or more existing open orders, for example the price, size or duration. The order is identified by OrderId in the body, not in the path.
- [POST /trade/v2/orders](https://openbrokerapi.com/brokers/saxo/endpoints/place-order): Places a new order, optionally with related limit and stop orders as children. A 200 reply can still carry ErrorInfo, so check for OrderId before treating the order as placed.
- [DELETE /trade/v2/orders/{OrderIds}](https://openbrokerapi.com/brokers/saxo/endpoints/cancel-orders): Cancels one or more open orders. Pass a comma separated list of order ids in the path and the AccountKey as a query parameter.
- [POST /trade/v2/orders/multileg](https://openbrokerapi.com/brokers/saxo/endpoints/place-multileg-order): Places a combined options order whose legs must all fill together, for strategies such as straddles and calendar spreads. Saxo says only some options exchanges support it.
- [POST /trade/v2/orders/precheck](https://openbrokerapi.com/brokers/saxo/endpoints/precheck-order): Checks an order without placing it and returns the expected costs, cash required and margin impact. Useful to show a cost preview before the user confirms.

## Saxo messages

5 documented messages. They are not HTTP endpoints: none has a method or a path. [Grouped by what they do](https://openbrokerapi.com/brokers/saxo/messages).

- [_disconnect](https://openbrokerapi.com/brokers/saxo/messages/disconnect) (Saxo OpenAPI streaming connection): Sent when the server is closing the user's streams, for example after the user changes the account password. No more messages follow, and requests are refused with 401 until the user logs in again.
- [_heartbeat](https://openbrokerapi.com/brokers/saxo/messages/heartbeat) (Saxo OpenAPI streaming connection): Sent when a subscription has had no data for a while, to show the connection is still alive. One message can bundle a heartbeat for each of several subscriptions, each with a reason.
- [_resetsubscriptions](https://openbrokerapi.com/brokers/saxo/messages/resetsubscriptions) (Saxo OpenAPI streaming connection): Tells the client to delete some of its subscriptions and create them again, after the server has detected a lost message or another error. Where it names no subscriptions, every subscription on the connection is to be reset.
- [connect](https://openbrokerapi.com/brokers/saxo/messages/connect) (Saxo OpenAPI streaming connection): Opens the streaming WebSocket. It is an HTTP GET that upgrades to a WebSocket, carrying a context id you choose and an access token. Data for every subscription made with that context id then arrives on this one connection.
- [Data message](https://openbrokerapi.com/brokers/saxo/messages/data-message) (Saxo OpenAPI streaming connection): The binary layout every streaming message arrives in: a message id, the reference id of the subscription it belongs to, a payload format and the payload. One WebSocket frame can hold several messages, and one message can be split across frames.

## Saxo API error codes

143 decoded error codes. [All Saxo OpenAPI errors](https://openbrokerapi.com/errors/saxo).

- [_disconnect](https://openbrokerapi.com/errors/saxo/disconnect): A control message on a streaming connection.
- [_resetsubscriptions](https://openbrokerapi.com/errors/saxo/resetsubscriptions): A control message on a streaming connection.
- [ActiveFollowerCannotDoManualTrade](https://openbrokerapi.com/errors/saxo/active-follower-no-manual-trade): Opening or closing a position is not allowed on an active strategy account.
- [AlgoOrderTimeBeforeExchangeOpen](https://openbrokerapi.com/errors/saxo/algo-order-time-before-exchange-open): An algo order parameter carries a time before the exchange opens.
- [AmountBelowMinimumLotSize](https://openbrokerapi.com/errors/saxo/amount-below-minimum-lot-size): The order size is below the exchange's minimum lot size.
- [AmountCannotBeLessThanFilledAmount](https://openbrokerapi.com/errors/saxo/amount-less-than-filled-amount): The amount cannot be less than the amount already filled.
- [AmountNotInLotSize](https://openbrokerapi.com/errors/saxo/amount-not-in-lot-size): The order size is not a valid lot size for the exchange.
- [BlocksExistForOwnedContracts](https://openbrokerapi.com/errors/saxo/blocks-exist-for-owned-contracts): A block exists for the owned contract.
- [BreakoutUpPriceCannotBeLessThanDownPrice](https://openbrokerapi.com/errors/saxo/breakout-up-price-below-down): The breakout up price cannot be less than the down price.
- [BrokerOption](https://openbrokerapi.com/errors/saxo/broker-option): Saxo's page describes this code only with the words Broker Option.
- [CashAmountLessThanMinInitialInvestmentAmount](https://openbrokerapi.com/errors/saxo/cash-below-min-initial-investment): The cash amount must be at least the minimum investment amount.
- [ClientCountrySanctioned](https://openbrokerapi.com/errors/saxo/client-country-sanctioned): The user is disabled from trading because their country is sanctioned.
- [ClientExposureLimitation](https://openbrokerapi.com/errors/saxo/client-exposure-limitation): The trade would take the client past an exposure limitation.
- [ClientNotEnabledForExtendedTradingHours](https://openbrokerapi.com/errors/saxo/client-not-enabled-extended-hours): The client is not enabled for trading in extended trading hours.
- [ClientOnReduceForcedExposureReductionViolation](https://openbrokerapi.com/errors/saxo/client-on-reduce-exposure-violation): The client is in the Reduce group type, so exposure cannot be increased.
- [ClosingPositionNotAllowedForMultiDayExecutionOrder](https://openbrokerapi.com/errors/saxo/closing-not-allowed-multi-day-order): A position that came from a multi-day order execution does not support an explicit closing order.
- [ClosingPositionNotAllowedOnJointExecutionModel](https://openbrokerapi.com/errors/saxo/closing-not-allowed-joint-execution): Closing a position is not allowed for Trade Leaders.
- [ConditionDurationNotSupported](https://openbrokerapi.com/errors/saxo/condition-duration-not-supported): The condition's duration is not supported for this asset type.
- [ConditionOnWrongSideOfMarket](https://openbrokerapi.com/errors/saxo/condition-on-wrong-side-of-market): The condition price is on the wrong side of the market.
- [ConditionPriceExceedsAggressiveTolerance](https://openbrokerapi.com/errors/saxo/condition-price-exceeds-tolerance): The condition price is beyond the aggressive tolerance.
- [ConditionTooFarFromMarket](https://openbrokerapi.com/errors/saxo/condition-too-far-from-market): The condition's limit price is too far from the market.
- [ContactExposureLimitation](https://openbrokerapi.com/errors/saxo/contact-exposure-limitation): The trade would take exposure past the cap set at contact level.
- [CouldNotCompleteRequest](https://openbrokerapi.com/errors/saxo/could-not-complete-request): The operation could not be completed and Saxo will not disclose why.
- [CrossCurrencyOrderOnMarginLendingAccountNotAllowed](https://openbrokerapi.com/errors/saxo/cross-currency-on-margin-lending): A cross currency order is not supported on a MarginLending account.
- [DealCaptureAllocationKeyNotCorrect](https://openbrokerapi.com/errors/saxo/deal-capture-allocation-key): The deal capture allocation key is not correct.
- [DealCaptureInformationNotCorrect](https://openbrokerapi.com/errors/saxo/deal-capture-information): The deal capture information is not correct.
- [DomainValidationError](https://openbrokerapi.com/errors/saxo/domain-validation-error): Domain validation of the request failed.
- [DurationNotSupported](https://openbrokerapi.com/errors/saxo/duration-not-supported): The duration supplied is not supported for this order.
- [ExpirationDateInPast](https://openbrokerapi.com/errors/saxo/expiration-date-in-past): The expiration date is in the past.
- [ExpirationDateRequired](https://openbrokerapi.com/errors/saxo/expiration-date-required): An expiration date is mandatory for this type of order request.
- [ExplicitCloseNotAllowedForIntradayNetting](https://openbrokerapi.com/errors/saxo/explicit-close-intraday-netting): Closing a position explicitly is not allowed when real-time netting is enabled.
- [ExtendedHoursTradingCannotBeChanged](https://openbrokerapi.com/errors/saxo/extended-hours-cannot-be-changed): The value for extended trading hours cannot be changed.
- [FeatureNotEnabled](https://openbrokerapi.com/errors/saxo/feature-not-enabled): An OpenAPI feature has been disabled through Saxo's Front Office.
- [ForcedExposureReductionViolation](https://openbrokerapi.com/errors/saxo/forced-exposure-reduction-violation): A forced exposure reduction rule would be broken.
- [ForceOpenNotAllowed](https://openbrokerapi.com/errors/saxo/force-open-not-allowed): Force open is not allowed.
- [ForwardDateInPast](https://openbrokerapi.com/errors/saxo/forward-date-in-past): The forward date is in the past.
- [ForwardDateRequired](https://openbrokerapi.com/errors/saxo/forward-date-required): A forward date is mandatory.
- [GtdOrderCannotBeLaterThanExpiry](https://openbrokerapi.com/errors/saxo/gtd-order-later-than-expiry): A good till date order cannot run later than the instrument's expiry.
- [HTTP 400](https://openbrokerapi.com/errors/saxo/bad-request): Saxo rejected the request as sent: it was malformed or it broke a business rule.
- [HTTP 401](https://openbrokerapi.com/errors/saxo/unauthorised): Saxo refused the request because the Authorization header was missing or the security token in it was not valid.
- [HTTP 403](https://openbrokerapi.com/errors/saxo/forbidden): Forbidden.
- [HTTP 404](https://openbrokerapi.com/errors/saxo/not-found): The resource in the request does not exist, for example an unknown instrument on an info price request.
- [HTTP 409 (duplicate order)](https://openbrokerapi.com/errors/saxo/409-duplicate-order): An identical order was sent within a rolling 15 second window and was rejected.
- [HTTP 426](https://openbrokerapi.com/errors/saxo/426-upgrade-required): Upgrade Required.
- [HTTP 429](https://openbrokerapi.com/errors/saxo/429): Rate limit exceeded: 120 requests per minute per session per service group, 1 order per second per session, or 10,000,000 per day per app.
- [HTTP 500](https://openbrokerapi.com/errors/saxo/internal-service-error): Internal service error.
- [HTTP 503](https://openbrokerapi.com/errors/saxo/service-unavailable): The service is temporarily unavailable.
- [IllegalAccount](https://openbrokerapi.com/errors/saxo/illegal-account): The account is illegal for this request.
- [IllegalAmount](https://openbrokerapi.com/errors/saxo/illegal-amount): The amount is illegal for this request.
- [IllegalAssetType](https://openbrokerapi.com/errors/saxo/illegal-asset-type): The asset type is illegal for this request.
- [IllegalDate](https://openbrokerapi.com/errors/saxo/illegal-date): A date in the request is illegal.
- [IllegalInstrumentId](https://openbrokerapi.com/errors/saxo/illegal-instrument-id): The instrument is unknown.
- [IllegalRequest](https://openbrokerapi.com/errors/saxo/illegal-request): The request type is not supported.
- [IllegalStrike](https://openbrokerapi.com/errors/saxo/illegal-strike): The strike price is illegal.
- [IncorrectValuationTypeAndNettingMethod](https://openbrokerapi.com/errors/saxo/incorrect-valuation-and-netting): An order that combines a yield based valuation type with the average netting method cannot be placed.
- [InstrumentDisabledForTrading](https://openbrokerapi.com/errors/saxo/instrument-disabled-for-trading): Trading is disabled for the instrument.
- [InstrumentForcedExposureReductionViolation](https://openbrokerapi.com/errors/saxo/instrument-exposure-reduction): Exposure cannot be increased because of the instrument's configuration.
- [InstrumentHasExpired](https://openbrokerapi.com/errors/saxo/instrument-has-expired): The instrument has expired.
- [InstrumentNotAllowed](https://openbrokerapi.com/errors/saxo/instrument-not-allowed): The account is not allowed to trade this instrument.
- [InstrumentNotSupportedForExtendedHours](https://openbrokerapi.com/errors/saxo/instrument-no-extended-hours): Extended trading hours are not configured for the instrument.
- [InsufficientCash](https://openbrokerapi.com/errors/saxo/insufficient-cash): Saxo lists InsufficientCash among the 400 codes on its page for placing an order: the account does not hold enough cash for the order as sent.
- [InsufficientCash_CausedByOvernightAddOn](https://openbrokerapi.com/errors/saxo/insufficient-cash-overnight-add-on): There is not enough cash to make the trade.
- [InternalTimeout](https://openbrokerapi.com/errors/saxo/internal-timeout): A timeout happened inside Saxo's application.
- [InvalidAcceptLanguageHeader](https://openbrokerapi.com/errors/saxo/invalid-accept-language-header): The Accept-Language header contains a language that is not valid, or is malformed.
- [InvalidAllocationKeyUsed](https://openbrokerapi.com/errors/saxo/invalid-allocation-key-used): The order or trade was placed with an allocation key that is marked inactive or deleted.
- [InvalidMediaTypeHeader](https://openbrokerapi.com/errors/saxo/invalid-media-type-header): The Accept or Content-Type header contains a media type that is not valid, or is malformed.
- [InvalidModelState](https://openbrokerapi.com/errors/saxo/invalid-model-state): One or more properties of the request are not valid.
- [InvalidOrderRelation](https://openbrokerapi.com/errors/saxo/invalid-order-relation): The order relation is not valid.
- [InvalidQueryParameters](https://openbrokerapi.com/errors/saxo/invalid-query-parameters): Query parameters sent to a query endpoint are not valid.
- [InvalidRequest](https://openbrokerapi.com/errors/saxo/invalid-request): The default error code when Saxo cannot tell which part of the request is malformed.
- [InvalidRequestHeader](https://openbrokerapi.com/errors/saxo/invalid-request-header): One or more request headers are not valid, and Saxo cannot say which one.
- [InvalidUic](https://openbrokerapi.com/errors/saxo/invalid-uic): The Uic is not valid, or was not specified at all.
- [InvalidValueDate](https://openbrokerapi.com/errors/saxo/invalid-value-date): The value date is not valid.
- [LimitTooFarFromStop](https://openbrokerapi.com/errors/saxo/limit-too-far-from-stop): The limit price is too far away from the stop price.
- [MarketClosed](https://openbrokerapi.com/errors/saxo/market-closed): Saxo lists MarketClosed among the 400 codes on its page for placing an order: the instrument is not trading at the moment the order arrived.
- [NotOwned](https://openbrokerapi.com/errors/saxo/not-owned): The request tries to sell contracts that are not owned.
- [NotPrimarySession](https://openbrokerapi.com/errors/saxo/not-primary-session): The operation is not allowed because the session is not in Primary session mode.
- [NotSuitable](https://openbrokerapi.com/errors/saxo/not-suitable): The order was rejected because the instrument is not currently suitable for the client, or because a suitability test has not been taken.
- [NotTradableAtPresent](https://openbrokerapi.com/errors/saxo/not-tradable-at-present): The instrument is not tradable at present.
- [OnlyLimitOrderAllowedForExtendedHours](https://openbrokerapi.com/errors/saxo/only-limit-order-extended-hours): An extended hours order must have the order type limit.
- [OnlySidedReductionAllowed](https://openbrokerapi.com/errors/saxo/only-sided-reduction-allowed): Only a sided reduction of exposure is allowed.
- [OnWrongSideOfMarket](https://openbrokerapi.com/errors/saxo/on-wrong-side-of-market): The order price is on the wrong side of the market.
- [OptionExerciseAfterCutoff](https://openbrokerapi.com/errors/saxo/option-exercise-after-cutoff): Exercise is not allowed after the exercise cut-off time, or on the last trading day or later.
- [OptionExerciseNotAllowedDueExDateOfUpcomingCorporateActionOnInstrument](https://openbrokerapi.com/errors/saxo/option-exercise-corporate-action): Option exercise is not allowed on the day before the expiry date of an upcoming corporate action on the instrument.
- [OrderCommandPending](https://openbrokerapi.com/errors/saxo/order-command-pending): The order request is waiting for broker confirmation, which is still possible.
- [OrderCommandTimeout](https://openbrokerapi.com/errors/saxo/order-command-timeout): The order request timed out.
- [OrderExceedsMarketLimitUpDownTolerance](https://openbrokerapi.com/errors/saxo/order-exceeds-limit-up-down): The order price is beyond the current price limits on the market.
- [OrderIsRestrictedForAccountManagementType](https://openbrokerapi.com/errors/saxo/order-restricted-account-mgmt-type): The order is restricted for this account management type.
- [OrderNotFound](https://openbrokerapi.com/errors/saxo/order-not-found): The order id requested was not found.
- [OrderNotPlaced](https://openbrokerapi.com/errors/saxo/order-not-placed): The order was not placed because another order in the same request was rejected.
- [OrderNotSupportedForAccountType](https://openbrokerapi.com/errors/saxo/order-not-supported-account-type): The order is not supported for a MarginLending account.
- [OrderPriceOutsideLimit](https://openbrokerapi.com/errors/saxo/order-price-outside-limit): The price is too far from the market.
- [OrderRejectedByBroker](https://openbrokerapi.com/errors/saxo/order-rejected-by-broker): The order was rejected by the broker.
- [OrderRelatedPositionIsClosed](https://openbrokerapi.com/errors/saxo/order-related-position-is-closed): The related position is already closed.
- [OrderRelatedPositionMissMatch](https://openbrokerapi.com/errors/saxo/order-related-position-miss-match): The order does not match its related position.
- [OrderRequestAfterLastTradingDate](https://openbrokerapi.com/errors/saxo/order-after-last-trading-date): The instrument's last trading date has passed.
- [OrderSizeGreaterThanMaximumAllowed](https://openbrokerapi.com/errors/saxo/order-size-above-maximum): The order size is greater than the maximum order size allowed.
- [OrderTypeNotSupported](https://openbrokerapi.com/errors/saxo/order-type-not-supported): The order type is not supported.
- [OrderValueTooLarge](https://openbrokerapi.com/errors/saxo/order-value-too-large): The order value is too large.
- [OrderValueToSmall](https://openbrokerapi.com/errors/saxo/order-value-to-small): The order value must be above the minimum order value for the exchange.
- [OtherError](https://openbrokerapi.com/errors/saxo/other-error): A catch-all for a long collection of order errors that each occur very seldom.
- [PriceExceedsAggressiveTolerance](https://openbrokerapi.com/errors/saxo/price-exceeds-aggressive-tolerance): The price is beyond the aggressive tolerance.
- [PriceHasMoved](https://openbrokerapi.com/errors/saxo/price-has-moved): The price has moved.
- [PriceNotInTickSizeIncrements](https://openbrokerapi.com/errors/saxo/price-not-in-tick-size-increments): The order price is not in tick size increments.
- [RateLimitExceeded](https://openbrokerapi.com/errors/saxo/rate-limit-exceeded): A throttling policy quota has been exceeded.
- [RelatedOrClosingOrderNotAllowedForIntradayNettingClients](https://openbrokerapi.com/errors/saxo/related-order-intraday-netting): Orders related to a position are not allowed when real-time netting is enabled.
- [RelatedOrderNotAllowedForInstrument](https://openbrokerapi.com/errors/saxo/related-order-not-for-instrument): Related orders are not supported for this instrument.
- [RelatedOrderNotAllowedForIpo](https://openbrokerapi.com/errors/saxo/related-order-not-allowed-for-ipo): Related orders are not supported for an eIPO.
- [RelatedOrderNotAllowedForShortLived](https://openbrokerapi.com/errors/saxo/related-order-not-for-short-lived): Related orders are not supported for short lived orders.
- [RelatedOrderNotAllowedOnChildOrder](https://openbrokerapi.com/errors/saxo/related-order-not-on-child-order): Related orders are not allowed on allocated child orders.
- [RelatedOrderNotAllowedOnMultiLegPartialFilled](https://openbrokerapi.com/errors/saxo/related-order-multi-leg-partial): A related order is not allowed on a partially filled multi-leg position.
- [RelatedOrderNotAllowedOnTrailingStopOrder](https://openbrokerapi.com/errors/saxo/related-order-not-on-trailing-stop): Related orders are not allowed on a trailing stop order.
- [RelatedPositionAlreadyHasImplicitClosingOrders](https://openbrokerapi.com/errors/saxo/related-position-has-closing-orders): The related position already has implicit closing orders.
- [RelatedPositionAlreadyHasRelatedOrders](https://openbrokerapi.com/errors/saxo/related-position-has-related-orders): The related position already has related orders.
- [RelatedPositionAlreadyHasRelatedOrderType](https://openbrokerapi.com/errors/saxo/related-position-has-order-type): The related position already has a related order of this type.
- [RelatedPositionNotFound](https://openbrokerapi.com/errors/saxo/related-position-not-found): The related position was not found.
- [RepeatTradeOnAutoQuote](https://openbrokerapi.com/errors/saxo/repeat-trade-on-auto-quote): A repeated trade on an auto quote.
- [RequestNotAllowed](https://openbrokerapi.com/errors/saxo/request-not-allowed): The request is not allowed.
- [ReservedByShortContractOptions](https://openbrokerapi.com/errors/saxo/reserved-by-short-contract-options): The instrument cannot be sold because it is reserved by short contract options.
- [SellExceedsSettledExposure](https://openbrokerapi.com/errors/saxo/sell-exceeds-settled-exposure): Selling on day T is capped at the end of day position of day T minus 1.
- [SellOrdersAlreadyExistForOwnedContracts](https://openbrokerapi.com/errors/saxo/sell-orders-exist-for-owned): The contracts are owned, but sell orders already exist for them.
- [ShortTradeDisabled](https://openbrokerapi.com/errors/saxo/short-trade-disabled): Short trading is disabled for the instrument selected.
- [SubscriptionLimitExceeded](https://openbrokerapi.com/errors/saxo/subscription-limit): The session already holds the maximum number of subscriptions allowed for the type requested.
- [SubscriptionPermanentlyDisabled](https://openbrokerapi.com/errors/saxo/subscription-permanently-disabled): A heartbeat reason on a streaming subscription.
- [SubscriptionTemporarilyDisabled](https://openbrokerapi.com/errors/saxo/subscription-temporarily-disabled): A heartbeat reason on a streaming subscription.
- [TooCloseToMarket](https://openbrokerapi.com/errors/saxo/too-close-to-market): The guaranteed stop is too close to the market.
- [TooCloseToOcoRelatedOrderPrice](https://openbrokerapi.com/errors/saxo/too-close-to-oco-related-order-price): The order price is too close to the price of its OCO related order.
- [TooFarFromEntryOrder](https://openbrokerapi.com/errors/saxo/too-far-from-entry-order): The order price is too far from the entry order.
- [TooFarFromMarket](https://openbrokerapi.com/errors/saxo/too-far-from-market): The limit price is too far from the market.
- [ToOpenNotAllowedOnInstrument](https://openbrokerapi.com/errors/saxo/to-open-not-allowed-on-instrument): Increasing exposure is not allowed on this adjusted option class.
- [TradeNotCompleted](https://openbrokerapi.com/errors/saxo/trade-not-completed): The order endpoint waited 60 seconds without hearing back from the broker, so it answered 202 Accepted with an OrderId and this code.
- [TradingDisabled](https://openbrokerapi.com/errors/saxo/trading-disabled): Trading is disabled for the client.
- [TradingOnNonFundedAccount](https://openbrokerapi.com/errors/saxo/trading-on-non-funded-account): The investment account in the request is not available on this platform.
- [TypeConversionError](https://openbrokerapi.com/errors/saxo/type-conversion-error): A value in the request could not be converted to the type the endpoint expects.
- [UnsupportedSubscriptionFormat](https://openbrokerapi.com/errors/saxo/unsupported-subscription-format): The subscription asked for a format that the publisher does not support.
- [WouldComeTooCloseToAccountValueProtectionLimit](https://openbrokerapi.com/errors/saxo/too-close-to-value-protection): A precheck found that the trade would come too close to the account value protection limit.
- [WouldExceedAccountValueProtectionLimit](https://openbrokerapi.com/errors/saxo/would-exceed-value-protection): The trade would go past the account value protection limit.
- [WouldExceedMargin](https://openbrokerapi.com/errors/saxo/would-exceed-margin): Saxo lists WouldExceedMargin among the 400 codes on its page for placing an order: the order would take the account past its margin allowance.
- [WouldExceedMarginCeiling](https://openbrokerapi.com/errors/saxo/would-exceed-margin-ceiling): The trade would go past the margin ceiling.
- [WouldExceedMaxCreditLine](https://openbrokerapi.com/errors/saxo/would-exceed-max-credit-line): The trade would use more than the available maximum credit (collateral) line.
- [WouldExceedMaxCreditLineLimit](https://openbrokerapi.com/errors/saxo/would-exceed-max-credit-line-limit): The trade would go past the cap on the available maximum credit (collateral) line.
- [WouldExceedTradingLine](https://openbrokerapi.com/errors/saxo/would-exceed-trading-line): The trade would go past the trading line limits.
- [WrongSideOfRelatedOrder](https://openbrokerapi.com/errors/saxo/wrong-side-of-related-order): The order price is on the wrong side of its related order.

## Platform APIs an account here can reach

- [MetaTrader 4 (MQL4)](https://openbrokerapi.com/platforms/metatrader-4): not offered. Help centre states: 'Saxo does not offer MetaTrader (MT4) platform.' Saxo points clients to SaxoTrader and its OpenAPI instead.
  - Status: verified. Source: [Does Saxo offer the MetaTrader platform? (Saxo help centre)](https://www.help.saxo/hc/en-us/articles/360022686632-Does-Saxo-offer-the-MetaTrader-platform), checked 2026-09-18.
- [MetaTrader 5 (Python package and MQL5)](https://openbrokerapi.com/platforms/metatrader-5): not offered. MT5 not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified.
  - Status: unverified. Source: [Saxo UK platforms](https://www.home.saxo/en-gb/platforms), checked 2026-09-18.
- [cTrader Open API](https://openbrokerapi.com/platforms/ctrader): not offered. cTrader not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified.
  - Status: unverified. Source: [Saxo UK platforms](https://www.home.saxo/en-gb/platforms), checked 2026-09-18.
- [TradeLocker API](https://openbrokerapi.com/platforms/tradelocker): not offered. TradeLocker not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified.
  - Status: unverified. Source: [Saxo UK platforms](https://www.home.saxo/en-gb/platforms), checked 2026-09-18.
- [Match-Trader Platform API](https://openbrokerapi.com/platforms/match-trader): not offered. Match-Trader not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified.
  - Status: unverified. Source: [Saxo UK platforms](https://www.home.saxo/en-gb/platforms), checked 2026-09-18.
- [DXtrade APIs](https://openbrokerapi.com/platforms/dxtrade): not offered. DXtrade not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified.
  - Status: unverified. Source: [Saxo UK platforms](https://www.home.saxo/en-gb/platforms), checked 2026-09-18.

## Saxo API SDKs and wrappers

- openapi-samples-js (JavaScript, Official)
  - Status: unverified. Source: [github.com](https://github.com/SaxoBank/openapi-samples-js), no checked date recorded.
- openapi-samples-csharp (C#, Official)
  - Status: unverified. Source: [github.com](https://github.com/SaxoBank/openapi-samples-csharp), no checked date recorded.
- saxo_openapi (Python, Community): Community wrapper, last release 0.6.0 in Sept 2019.
  - Status: verified. Source: [pypi.org](https://pypi.org/project/saxo-openapi/), checked 2026-09-18.
- openapi-clientlib-js (JavaScript, Official): Official JS client library, archived.
  - Status: verified. Source: [github.com](https://github.com/SaxoBank), checked 2026-09-18.

## Saxo API: questions and answers

### Does Saxo have an API?

Yes. This register records Saxo as having its own API (REST and WebSocket streaming), with availability marked as active. OAuth 2.0 REST and WebSocket API, with a free simulation environment.

- Status: verified. Source: [Getting started, Saxo OpenAPI](https://www.developer.saxo/openapi/learn), checked 2026-09-20.

### Saxo API key: how do I get one?

Create a developer portal account for SIM (24 hour token or registered app); apply for live app credentials after testing.

- Status: verified. Source: [Saxo OpenAPI Learn](https://www.developer.saxo/openapi/learn), checked 2026-09-20.

### Who can use the Saxo API?

Direct retail and professional clients may use it for personal use; a live account must be funded before creating a live app.

- Status: verified. Source: [Saxo Support: personal use](https://openapi.help.saxo/hc/en-us/articles/4416505486481-Can-I-use-OpenAPI-for-personal-use), checked 2026-09-21.

### Saxo API demo: is there a demo or sandbox?

Yes: SIM environment; 24 hour portal tokens work in SIM only.

- Status: verified. Source: [Saxo Environments](https://www.developer.saxo/openapi/learn/environments), checked 2026-09-20.

### What are the Saxo API rate limits?

Headline limit: 120/min per session, per service group. Scope: session. As the record words it: 10,000,000 requests a day per app; 120 a minute per session per service group; 1 order a second per session; a duplicate order inside 15 seconds is rejected with HTTP 409. Read 23 Sep 2026.

- Status: verified. Source: [developer.saxo](https://www.developer.saxo/openapi/learn/rate-limiting), checked 2026-09-18.
- Status: verified. Source: [Saxo OpenAPI: rate limiting](https://www.developer.saxo/openapi/learn/rate-limiting), checked 2026-09-23.

### How does Saxo API authentication work?

OAuth 2.0 authorization code (with or without PKCE); app key and secret for live. Refresh tokens rotate: each is invalidated on use and replaced. Certificate-based auth is for select partners only, not retail.

- Status: verified. Source: [Saxo OpenAPI Learn](https://www.developer.saxo/openapi/learn), checked 2026-09-20.

### Does the Saxo API support streaming?

WebSocket streaming (SIM and live hosts).

- Status: verified. Source: [Saxo Environments](https://www.developer.saxo/openapi/learn/environments), checked 2026-09-21.

### How much history does the Saxo API return?

Chart samples max 1,200 per request; some FX data back to 2002. Trades report takes FromDate and ToDate with no stated limit.

- Status: verified. Source: [Saxo OpenAPI Support: How many samples can be returned at a time?](https://openapi.help.saxo/hc/en-us/articles/4417065320977-How-many-samples-can-be-returned-at-a-time), checked 2026-09-22.

### Is there a Python library for the Saxo API?

This register lists one Python library for the Saxo API. saxo_openapi (community, Python): Community wrapper, last release 0.6.0 in Sept 2019.

- Status: verified. Source: [saxo_openapi](https://pypi.org/project/saxo-openapi/), checked 2026-09-18.

### Which platform APIs work with an account at Saxo?

Recorded as not offered, with a source: MetaTrader 4. Not verified either way: MetaTrader 5, cTrader, TradeLocker, Match-Trader and DXtrade.

- Status: verified. Source: [Does Saxo offer the MetaTrader platform? (Saxo help centre)](https://www.help.saxo/hc/en-us/articles/360022686632-Does-Saxo-offer-the-MetaTrader-platform), checked 2026-09-18.

[Saxo API questions, each answered in a sentence or two](https://openbrokerapi.com/answers/saxo).

## Partner programme

No published figure. [The Saxo Bank partner programme record](https://openbrokerapi.com/partners/saxo). This site carries no affiliate links.

## Licence and how to cite

The limit records on this page come from the limits register, which is CC BY 4.0 (https://openbrokerapi.com/data/limits.json). Everything else on it comes from records that are all rights reserved. This file is the page itself, at its own address, in another format, and it is not part of the CC BY 4.0 downloads listed at https://openbrokerapi.com/data.

Cite as: Saxo OpenAPI: limits, auth and errors. Broker API Hub, https://openbrokerapi.com/brokers/saxo, newest check 2026-10-12.

Where you rely on a single figure, cite the source and the checked date printed beside it as well. Where this page and a broker's own documentation differ, the documentation wins.
