# Saxo _heartbeat

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/messages/heartbeat, 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.

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.

- Message: `_heartbeat`
- Interface: Saxo OpenAPI streaming connection
- Group: Control messages
- Status: verified. Source: [developer.saxo](https://www.developer.saxo/openapi/learn/streaming), checked 2026-10-12.

This is a message of the Saxo OpenAPI streaming connection, not an HTTP endpoint. It has no method and no path: it travels over an open WebSocket connection. It is in no OpenAPI file on this site and the request builder does not list it.

Note: The page tells a client to keep track of when it last received a message or a heartbeat, and to reconnect with the last message id seen where they stop. Where the reason is SubscriptionPermanentlyDisabled it says to remove the subscriptions named.

## The message

- Name: `_heartbeat`
- Direction: Event, sent by the server
- Carried by: WebSocket. Saxo's page says the connection is a plain WebSocket carrying data in binary frames. Subscriptions are not made on it: each is created with an HTTP POST that names the same context id, and those calls are recorded on this site as endpoints.
- Simulation, as the page's example prints it: `https://sim-streaming.saxobank.com/sim/oapi/streaming/ws/connect`

## Fields

- `ReferenceId` (type not stated, required or not: not stated): Always _heartbeat. Like every control message, it starts with an underscore.
- `Heartbeats` (type not stated, required or not: not stated): A list with one entry for each subscription the heartbeat is for.
- `Heartbeats[].OriginatingReferenceId` (type not stated, required or not: not stated): The reference id of the subscription.
- `Heartbeats[].Reason` (type not stated, required or not: not stated): NoNewData where there is simply nothing new. SubscriptionTemporarilyDisabled where a recoverable server error is holding data back. SubscriptionPermanentlyDisabled where no data will come, most likely through a misconfiguration.

## Sample

Written by this site from the fields recorded on this page. It has not been run against a terminal, a server or an account, and the values in it are placeholders. No credential is typed into it: where a field holds one, the placeholder says where it comes from. Nothing is entered on this site.

```json
[
  {
    "ReferenceId": "_heartbeat",
    "Heartbeats": [
      {
        "OriginatingReferenceId": "IP44964",
        "Reason": "NoNewData"
      }
    ]
  }
]
```

## Limits that apply at Saxo OpenAPI

- 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.

## Related Saxo messages: Control messages

- [_disconnect](https://openbrokerapi.com/brokers/saxo/messages/disconnect): 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.
- [_resetsubscriptions](https://openbrokerapi.com/brokers/saxo/messages/resetsubscriptions): 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.

## More on Saxo

- [All Saxo messages](https://openbrokerapi.com/brokers/saxo/messages): 5 documented here, grouped by what they do.
- [Saxo API quickstart](https://openbrokerapi.com/brokers/saxo/quickstart)
- [All Saxo error codes](https://openbrokerapi.com/errors/saxo)
- [Saxo API page](https://openbrokerapi.com/brokers/saxo): The full record: access, authentication, limits and the source for each.

## Licence and how to cite

The records behind this page are all rights reserved. This file is the page itself, at its own address, in another format. It is not part of the CC BY 4.0 downloads listed at https://openbrokerapi.com/data. Quote from it with a link to the page.

Cite as: Saxo _heartbeat. Broker API Hub, https://openbrokerapi.com/brokers/saxo/messages/heartbeat, 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.
