Broker API
Saxo OpenAPI: limits, auth and errors
OAuth 2.0 REST and WebSocket API, with a free simulation environment.
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.
Quickstart: key to first call68 endpoints5 messages143 error codes
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.
| Limit | Value | Scope | Source |
|---|---|---|---|
| Headline limit | 120/min per session, per service group | session | developer.saxochecked |
Saxo API rate limits in full, with pacing advice and the related error codes.
Access, authentication and streaming
API types listed in the record: REST, WebSocket 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.
Saxo OpenAPI Learnchecked
- 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.
Saxo Support: personal usechecked
- Demo
Yes: SIM environment; 24 hour portal tokens work in SIM only.
Saxo Environmentschecked
- 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.
Saxo OpenAPI Learnchecked
- 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.
Saxo Environmentschecked
- 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.
Saxo OpenAPI Support: How many samples can be returned at a time?checked
- 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.
Saxo OpenAPI: rate limitingchecked
Saxo API endpoints
68 documented endpoints. Grouped by what they do
- GET/chart/v3/chartsReturns 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/subscriptionsSets 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}Removes one chart subscription, identified by its context and reference ids, and frees what it held on the server.
- GET/hist/v1/transactionsLists 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/summaryReturns 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/accountsLists the accounts owned by a client. With no ClientKey it answers for the logged in user's own client.
- GET/port/v1/accounts/{AccountKey}Details of one account: its identifiers, type, currency, whether it is active and what it is allowed to trade.
- GET/port/v1/accounts/meLists 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/subscriptionsSets up a streaming subscription on a list of accounts and returns a first snapshot of them.
- GET/port/v1/balancesBalance figures for a client, an account group or a single account: cash, cash available for trading, collateral and margin.
- GET/port/v1/balances/marginoverviewA margin overview for a client, an account group or a single account, returned as a list of groups.
- GET/port/v1/balances/meReturns cash, margin and total value for the logged in client, rolled up in the client's currency.
- POST/port/v1/balances/subscriptionsSets up a streaming subscription on a balance and returns a first snapshot of it.
- GET/port/v1/clients/{ClientKey}Details of one client by its key: identifiers, default account, default currency and the netting and trading settings that apply.
- GET/port/v1/clients/meReturns 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/closedpositionsLists closed positions for a client, an account group or an account, chosen by query parameters.
- GET/port/v1/closedpositions/{ClosedPositionId}One closed position by its id.
- GET/port/v1/closedpositions/meLists positions closed for the logged in client, with open and close prices, times and realised profit or loss.
- POST/port/v1/closedpositions/subscriptionsSets up a streaming subscription on a list of closed positions and returns a first snapshot of them.
- GET/port/v1/exposure/currency/meThe net exposure in each currency for the logged in user's client.
- GET/port/v1/exposure/fxspot/meThe currency exposure that comes from FX spot positions alone, for the logged in user's client.
- GET/port/v1/exposure/instruments/meThe net exposure in each instrument for the logged in user's client.
- GET/port/v1/netpositionsLists 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}One net position by its id, with static details in NetPositionBase and the live view in NetPositionView.
- GET/port/v1/netpositions/meLists 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/subscriptionsSets up a streaming subscription on a list of net positions and returns a first snapshot of them.
- GET/port/v1/ordersLists the open orders of a client or an account. By default only working orders are returned.
- GET/port/v1/orders/{ClientKey}/{OrderId}One open order of a client, looked up by the client's key and the order id.
- GET/port/v1/orders/meLists all open (working) orders across every account of the logged in client. Filled or cancelled orders do not appear here.
- POST/port/v1/orders/subscriptionsSets up a streaming subscription on a list of open orders and returns a first snapshot of them.
- GET/port/v1/positionsLists open positions for a client, an account group, an account or one net position, chosen by query parameters.
- GET/port/v1/positions/{PositionId}One open position by its id, with opening details in PositionBase and the live view in PositionView.
- GET/port/v1/positions/meLists 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/subscriptionsSets up a streaming subscription on a list of positions and returns a first snapshot of them.
- GET/port/v1/users/meReturns 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/entitlementsThe market data entitlements held by the logged in user's client, listed per exchange.
- GET/ref/v1/countriesThe countries Saxo supports, as a list.
- GET/ref/v1/culturesThe cultures Saxo supports for localising a user's preferences, as a list.
- GET/ref/v1/currenciesThe currencies Saxo supports, as a list.
- GET/ref/v1/currencypairsThe currency pairs Saxo supports, as a list.
- GET/ref/v1/exchangesEvery exchange Saxo lists, with details of each such as its identifiers, country, currency and sessions.
- GET/ref/v1/exchanges/{ExchangeId}Details of one exchange: its identifiers, country, currency, time zone and trading sessions.
- GET/ref/v1/instrumentsSearches 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/detailsDetailed reference data for a list of instruments in one call, chosen by Uic and asset type.
- GET/ref/v1/instruments/details/{Uic}/{AssetType}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}The trading schedule of one instrument: its sessions and the time zone they are given in.
- GET/ref/v1/languagesThe languages Saxo supports, as a list.
- GET/ref/v1/standarddates/forwardtenor/{Uic}The standard forward tenor dates for one instrument.
- GET/ref/v1/timezonesThe time zones Saxo supports, as a list.
- GET/root/v1/diagnostics/getA test call that does nothing but answer. Use it to check that a GET request reaches the gateway.
- GET/root/v1/features/availabilityWhich features are currently available, as a list of feature names each with a flag. Saxo marks this call obsolete.
- PUT/root/v1/sessions/capabilitiesChange the trade level of the current session, which decides whether it can trade on quotes and receive real time data.
- GET/root/v1/sessions/capabilitiesWhat the current session is allowed: its authentication level, data level and trade level.
- POST/root/v1/sessions/events/subscriptionsSets up a streaming subscription on the session's capabilities, so a change in them is pushed to you.
- GET/root/v1/userThe current user's id, client id, roles and the operations the token may perform. Saxo marks this call obsolete.
- GET/trade/v1/infopricesReturns 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/listInfo 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/subscriptionsSets up a streaming subscription on info prices for a list of instruments and returns a first snapshot.
- GET/trade/v1/messagesTrade messages for the current user that have not yet been marked as seen.
- PATCH/trade/v1/positions/{PositionId}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/subscriptionsSets 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}Removes one price subscription from the current streaming session, identified by its context and reference ids.
- DELETE/trade/v2/ordersCancels every order in one instrument on one account in a single call.
- PATCH/trade/v2/ordersChanges 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/ordersPlaces 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}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/multilegPlaces 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/precheckChecks 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 and subscriptions of the Saxo OpenAPI streaming connection. They are not HTTP endpoints: none has a method or a path, and each travels over a connection that stays open. Grouped by what they do, each with its summary
Saxo API error codes
143 decoded error codes. All Saxo OpenAPI errors
_A control message on a streaming connection.disconnect _A control message on a streaming connection.resetsubscriptions ActiveFollowerCannotDoManualTradeOpening or closing a position is not allowed on an active strategy account.AlgoOrderTimeBeforeExchangeOpenAn algo order parameter carries a time before the exchange opens.AmountBelowMinimumLotSizeThe order size is below the exchange's minimum lot size.AmountCannotBeLessThanFilledAmountThe amount cannot be less than the amount already filled.AmountNotInLotSizeThe order size is not a valid lot size for the exchange.BlocksExistForOwnedContractsA block exists for the owned contract.BreakoutUpPriceCannotBeLessThanDownPriceThe breakout up price cannot be less than the down price.BrokerOptionSaxo's page describes this code only with the words Broker Option.CashAmountLessThanMinInitialInvestmentAmountThe cash amount must be at least the minimum investment amount.ClientCountrySanctionedThe user is disabled from trading because their country is sanctioned.ClientExposureLimitationThe trade would take the client past an exposure limitation.ClientNotEnabledForExtendedTradingHoursThe client is not enabled for trading in extended trading hours.ClientOnReduceForcedExposureReductionViolationThe client is in the Reduce group type, so exposure cannot be increased.ClosingPositionNotAllowedForMultiDayExecutionOrderA position that came from a multi-day order execution does not support an explicit closing order.ClosingPositionNotAllowedOnJointExecutionModelClosing a position is not allowed for Trade Leaders.ConditionDurationNotSupportedThe condition's duration is not supported for this asset type.ConditionOnWrongSideOfMarketThe condition price is on the wrong side of the market.ConditionPriceExceedsAggressiveToleranceThe condition price is beyond the aggressive tolerance.ConditionTooFarFromMarketThe condition's limit price is too far from the market.ContactExposureLimitationThe trade would take exposure past the cap set at contact level.CouldNotCompleteRequestThe operation could not be completed and Saxo will not disclose why.CrossCurrencyOrderOnMarginLendingAccountNotAllowedA cross currency order is not supported on a MarginLending account.DealCaptureAllocationKeyNotCorrectThe deal capture allocation key is not correct.DealCaptureInformationNotCorrectThe deal capture information is not correct.DomainValidationErrorDomain validation of the request failed.DurationNotSupportedThe duration supplied is not supported for this order.ExpirationDateInPastThe expiration date is in the past.ExpirationDateRequiredAn expiration date is mandatory for this type of order request.ExplicitCloseNotAllowedForIntradayNettingClosing a position explicitly is not allowed when real-time netting is enabled.ExtendedHoursTradingCannotBeChangedThe value for extended trading hours cannot be changed.FeatureNotEnabledAn OpenAPI feature has been disabled through Saxo's Front Office.ForcedExposureReductionViolationA forced exposure reduction rule would be broken.ForceOpenNotAllowedForce open is not allowed.ForwardDateInPastThe forward date is in the past.ForwardDateRequiredA forward date is mandatory.GtdOrderCannotBeLaterThanExpiryA good till date order cannot run later than the instrument's expiry.HTTP 400Saxo rejected the request as sent: it was malformed or it broke a business rule.HTTP 401Saxo refused the request because the Authorization header was missing or the security token in it was not valid.HTTP 403Forbidden.HTTP 404The resource in the request does not exist, for example an unknown instrument on an info price request.HTTP 409 (duplicate order)An identical order was sent within a rolling 15 second window and was rejected.HTTP 426Upgrade Required.HTTP 429Rate 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 500Internal service error.HTTP 503The service is temporarily unavailable.IllegalAccountThe account is illegal for this request.IllegalAmountThe amount is illegal for this request.IllegalAssetTypeThe asset type is illegal for this request.IllegalDateA date in the request is illegal.IllegalInstrumentIdThe instrument is unknown.IllegalRequestThe request type is not supported.IllegalStrikeThe strike price is illegal.IncorrectValuationTypeAndNettingMethodAn order that combines a yield based valuation type with the average netting method cannot be placed.InstrumentDisabledForTradingTrading is disabled for the instrument.InstrumentForcedExposureReductionViolationExposure cannot be increased because of the instrument's configuration.InstrumentHasExpiredThe instrument has expired.InstrumentNotAllowedThe account is not allowed to trade this instrument.InstrumentNotSupportedForExtendedHoursExtended trading hours are not configured for the instrument.InsufficientCashSaxo 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_There is not enough cash to make the trade.CausedByOvernightAddOn InternalTimeoutA timeout happened inside Saxo's application.InvalidAcceptLanguageHeaderThe Accept-Language header contains a language that is not valid, or is malformed.InvalidAllocationKeyUsedThe order or trade was placed with an allocation key that is marked inactive or deleted.InvalidMediaTypeHeaderThe Accept or Content-Type header contains a media type that is not valid, or is malformed.InvalidModelStateOne or more properties of the request are not valid.InvalidOrderRelationThe order relation is not valid.InvalidQueryParametersQuery parameters sent to a query endpoint are not valid.InvalidRequestThe default error code when Saxo cannot tell which part of the request is malformed.InvalidRequestHeaderOne or more request headers are not valid, and Saxo cannot say which one.InvalidUicThe Uic is not valid, or was not specified at all.InvalidValueDateThe value date is not valid.LimitTooFarFromStopThe limit price is too far away from the stop price.MarketClosedSaxo lists MarketClosed among the 400 codes on its page for placing an order: the instrument is not trading at the moment the order arrived.NotOwnedThe request tries to sell contracts that are not owned.NotPrimarySessionThe operation is not allowed because the session is not in Primary session mode.NotSuitableThe order was rejected because the instrument is not currently suitable for the client, or because a suitability test has not been taken.NotTradableAtPresentThe instrument is not tradable at present.OnlyLimitOrderAllowedForExtendedHoursAn extended hours order must have the order type limit.OnlySidedReductionAllowedOnly a sided reduction of exposure is allowed.OnWrongSideOfMarketThe order price is on the wrong side of the market.OptionExerciseAfterCutoffExercise is not allowed after the exercise cut-off time, or on the last trading day or later.OptionExerciseNotAllowedDueExDateOfUpcomingCorporateActionOnInstrumentOption exercise is not allowed on the day before the expiry date of an upcoming corporate action on the instrument.OrderCommandPendingThe order request is waiting for broker confirmation, which is still possible.OrderCommandTimeoutThe order request timed out.OrderExceedsMarketLimitUpDownToleranceThe order price is beyond the current price limits on the market.OrderIsRestrictedForAccountManagementTypeThe order is restricted for this account management type.OrderNotFoundThe order id requested was not found.OrderNotPlacedThe order was not placed because another order in the same request was rejected.OrderNotSupportedForAccountTypeThe order is not supported for a MarginLending account.OrderPriceOutsideLimitThe price is too far from the market.OrderRejectedByBrokerThe order was rejected by the broker.OrderRelatedPositionIsClosedThe related position is already closed.OrderRelatedPositionMissMatchThe order does not match its related position.OrderRequestAfterLastTradingDateThe instrument's last trading date has passed.OrderSizeGreaterThanMaximumAllowedThe order size is greater than the maximum order size allowed.OrderTypeNotSupportedThe order type is not supported.OrderValueTooLargeThe order value is too large.OrderValueToSmallThe order value must be above the minimum order value for the exchange.OtherErrorA catch-all for a long collection of order errors that each occur very seldom.PriceExceedsAggressiveToleranceThe price is beyond the aggressive tolerance.PriceHasMovedThe price has moved.PriceNotInTickSizeIncrementsThe order price is not in tick size increments.RateLimitExceededA throttling policy quota has been exceeded.RelatedOrClosingOrderNotAllowedForIntradayNettingClientsOrders related to a position are not allowed when real-time netting is enabled.RelatedOrderNotAllowedForInstrumentRelated orders are not supported for this instrument.RelatedOrderNotAllowedForIpoRelated orders are not supported for an eIPO.RelatedOrderNotAllowedForShortLivedRelated orders are not supported for short lived orders.RelatedOrderNotAllowedOnChildOrderRelated orders are not allowed on allocated child orders.RelatedOrderNotAllowedOnMultiLegPartialFilledA related order is not allowed on a partially filled multi-leg position.RelatedOrderNotAllowedOnTrailingStopOrderRelated orders are not allowed on a trailing stop order.RelatedPositionAlreadyHasImplicitClosingOrdersThe related position already has implicit closing orders.RelatedPositionAlreadyHasRelatedOrdersThe related position already has related orders.RelatedPositionAlreadyHasRelatedOrderTypeThe related position already has a related order of this type.RelatedPositionNotFoundThe related position was not found.RepeatTradeOnAutoQuoteA repeated trade on an auto quote.RequestNotAllowedThe request is not allowed.ReservedByShortContractOptionsThe instrument cannot be sold because it is reserved by short contract options.SellExceedsSettledExposureSelling on day T is capped at the end of day position of day T minus 1.SellOrdersAlreadyExistForOwnedContractsThe contracts are owned, but sell orders already exist for them.ShortTradeDisabledShort trading is disabled for the instrument selected.SubscriptionLimitExceededThe session already holds the maximum number of subscriptions allowed for the type requested.SubscriptionPermanentlyDisabledA heartbeat reason on a streaming subscription.SubscriptionTemporarilyDisabledA heartbeat reason on a streaming subscription.TooCloseToMarketThe guaranteed stop is too close to the market.TooCloseToOcoRelatedOrderPriceThe order price is too close to the price of its OCO related order.TooFarFromEntryOrderThe order price is too far from the entry order.TooFarFromMarketThe limit price is too far from the market.ToOpenNotAllowedOnInstrumentIncreasing exposure is not allowed on this adjusted option class.TradeNotCompletedThe order endpoint waited 60 seconds without hearing back from the broker, so it answered 202 Accepted with an OrderId and this code.TradingDisabledTrading is disabled for the client.TradingOnNonFundedAccountThe investment account in the request is not available on this platform.TypeConversionErrorA value in the request could not be converted to the type the endpoint expects.UnsupportedSubscriptionFormatThe subscription asked for a format that the publisher does not support.WouldComeTooCloseToAccountValueProtectionLimitA precheck found that the trade would come too close to the account value protection limit.WouldExceedAccountValueProtectionLimitThe trade would go past the account value protection limit.WouldExceedMarginSaxo lists WouldExceedMargin among the 400 codes on its page for placing an order: the order would take the account past its margin allowance.WouldExceedMarginCeilingThe trade would go past the margin ceiling.WouldExceedMaxCreditLineThe trade would use more than the available maximum credit (collateral) line.WouldExceedMaxCreditLineLimitThe trade would go past the cap on the available maximum credit (collateral) line.WouldExceedTradingLineThe trade would go past the trading line limits.WrongSideOfRelatedOrderThe order price is on the wrong side of its related order.
Platform APIs an account here can reach
| Platform API | Offered | Note | Source |
|---|---|---|---|
| MetaTrader 4 (MQL4) | No | Help centre states: 'Saxo does not offer MetaTrader (MT4) platform.' Saxo points clients to SaxoTrader and its OpenAPI instead. | Does Saxo offer the MetaTrader platform? (Saxo help centre)checked |
| MetaTrader 5 (Python package and MQL5) | No | MT5 not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified. | UnverifiedSaxo UK platformschecked |
| cTrader Open API | No | cTrader not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified. | UnverifiedSaxo UK platformschecked |
| TradeLocker API | No | TradeLocker not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified. | UnverifiedSaxo UK platformschecked |
| Match-Trader Platform API | No | Match-Trader not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified. | UnverifiedSaxo UK platformschecked |
| DXtrade APIs | No | DXtrade not listed on the broker's UK platforms page; absence from an overview page is not proof, so unverified. | UnverifiedSaxo UK platformschecked |
Saxo API SDKs and wrappers
| Library | Language | Official | Note | Source |
|---|---|---|---|---|
| openapi-samples-js | JavaScript | Official | Not recorded | Unverifiedgithub.com |
| openapi-samples-csharp | C# | Official | Not recorded | Unverifiedgithub.com |
| saxo_openapi | Python | Community | Community wrapper, last release 0.6.0 in Sept 2019. | pypi.orgchecked |
| openapi-clientlib-js | JavaScript | Official | Official JS client library, archived. | github.comchecked |
Saxo API: questions and answers
Each answer is read from the record on this page, not written separately. Where the record is unverified, the answer says so.
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.
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.
Saxo OpenAPI Learnchecked
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.
Saxo Support: personal usechecked
Saxo API demo: is there a demo or sandbox?
Yes: SIM environment; 24 hour portal tokens work in SIM only.
Saxo Environmentschecked
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.
developer.saxochecked Saxo OpenAPI: rate limitingchecked
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.
Saxo OpenAPI Learnchecked
Does the Saxo API support streaming?
WebSocket streaming (SIM and live hosts).
Saxo Environmentschecked
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.
Saxo OpenAPI Support: How many samples can be returned at a time?checked
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.
saxo_openapichecked
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.
Does Saxo offer the MetaTrader platform? (Saxo help centre)checked
Saxo API questions, each answered in a sentence or two.
The capability tables read one feature at a time across every broker and platform record, Saxo included.
Everything this site records for Saxo OpenAPI, as one JSON file. Each section of the file states its own licence. About the files. This page as Markdown.
Saxo API guides and reference
Saxo API compared
The same fields from two records, side by side. No winner is picked.
What changed recently for the Saxo API
Documentation
Saxo's order placement page, re-read on 22 Sep 2026, now names only Market, Limit, Stop and StopLimit plus OCO; Stop if traded and trailing stop types are no longer listed there, so we mark them unverified. Its streaming page gives token refresh on the new sim-streaming and live-streaming hosts.
Addition
Saxo released an EventIds filter on ca/v2/eventviews for corporate action events. Non breaking.
Breaking
Breaking, and the deadline has passed: root/v1/user was removed and replaced by root/v2/user. An integration still on v1 is broken now, not later.
Saxo planned changeschecked
The newest entries are shown. Every dated change, all brokers and platforms. Follow Saxo changes by RSS
Open source repositories for Saxo
Read from GitHub's own records and ordered by stars as read. A listing is not a recommendation.
- hootnot/saxo_openapiPython
- SaxoBank/openapi-samples-jsJavaScript
Partner programme
No published figure. The Saxo Bank partner programme record. The programme register holds every record. This site carries no affiliate links.
How to cite this
Saxo OpenAPI: limits, auth and errors. Broker API Hub, https://openbrokerapi.com/brokers/saxo, newest check .
Where you rely on a single figure, cite the source and the checked date printed beside it as well.