---
updatedAt: 2026-09-16T07:05:29.000Z
agentTools:
  siteIndex: https://developer.bitmovin.com/llms.txt
  projectIndex: https://developer.bitmovin.com/encoding/llms.txt
---

# Live Heartbeat

The Live Heartbeat is a Global Notification that can be configured to be deployed to all live encoders in an organization. Once enabled as a global variable, the live heartbeat service will be deployed on all instances used for live encodings from that point forward.

The service provides a push notification as a webhook to a defined endpoint. Each Live Encoder sends the notification directly to that endpoint, making it the single source of truth about a live encoder's health and reported status. Deploying the heartbeat directly to the live encoder infrastructure also allows this service to scale, without the risk of their being a bottleneck in the Bitmovin multitenant platform.

# Enabling the Live Heartbeat

The live heartbeat is a global setting - therefore once configured all live encodings will start posting updates.

<Callout icon="📘" theme="info">
  ### You can configure multiple Heartbeats to multiple endpoints.

  However the payload of will always been the same and can not be modified.<br />Up to 5 Heartbeat webhooks can be configured per organization - see[ Webhook limits](https://developer.bitmovin.com/encoding/docs/ecoding-webhooks#webhook-limits).
</Callout>

## Via the Dashboard

To enable the notification navigate to Notifications in the Configurations settings under Live Encoding

<Image src="https://files.readme.io/c852c34-Screenshot_2024-08-02_at_16.00.49.png" align="center" />

From here, you can configure triggered event notifications via Webhook & Email, and Heartbeat.

<Image src="https://files.readme.io/2329e1d-Screenshot_2024-08-02_at_16.06.23.png" align="center" />

Pressing `Create+` will open a pop-up window where the Heartbeat can be configured and saved.

<Image src="https://files.readme.io/6fc366d-Screenshot_2024-08-02_at_16.02.40.png" align="center" />

`Interval` can be set in seconds, by default it will be 20 seconds, at minimum it can be 1 second.

After creation, you can review and delete the Live Heartbeat from this same view.

## Via the API

The new “Live Encoding Heartbeat” webhook can be configured via the<br />`/notifications/webhooks/encoding/encodings` API.

To list current heartbeats, use [List 'Live Encoding Heartbeat' Webhooks](https://developer.bitmovin.com/encoding/reference/getnotificationswebhooksencodingencodingsliveencodingheartbeat)

To create, use [Add 'Live Encoding Heartbeat' Webhook](https://developer.bitmovin.com/encoding/reference/postnotificationswebhooksencodingencodingsliveencodingheartbeat)

To get details, use ['Live Encoding Heartbeat' Webhook Details](https://developer.bitmovin.com/encoding/reference/getnotificationswebhooksencodingencodingsliveencodingheartbeatbywebhookid)

To delete, use [Delete 'Live Encoding Heartbeat' Webhook](https://developer.bitmovin.com/encoding/reference/deletenotificationswebhooksencodingencodingsliveencodingheartbeatbywebhookid)

After configuration, all new Live Encodings send the webhook at a fixed interval.

## <br />For a specific encoding

<br />

Webhook creation & deletion on a RUNNING, QUEUED live encoding is supported from version v2.285.0 onwards.

The heartbeat webhook for a specific encoding can be configured via the POST /notifications/webhooks/encoding/encodings/{encodingId} API. A maximum of 5 webhooks per encoding is allowed ([see Webhook limits](https://developer.bitmovin.com/encoding/docs/ecoding-webhooks#webhook-limits)).

To list current heartbeat webhooks, use [List 'Heartbeat Webhooks'](https://developer.bitmovin.com/encoding/reference/livegetnotificationswebhooksencodingencodingsliveencodingheartbeatbyencodingid) Webhooks for a specific encoding

To create, use [Add 'Heartbeat Webhooks'](https://developer.bitmovin.com/encoding/reference/livepostnotificationswebhooksencodingencodingsliveencodingheartbeatbyencodingid) Webhook for a specific encoding

To get details, use [Get 'Heartbeat Webhook'](https://developer.bitmovin.com/encoding/reference/livegetnotificationswebhooksencodingencodingsliveencodingheartbeatbyencodingidandwebhookid) Webhook Details for a specific encoding

To delete, use [Delete 'Heartbeat Webhook'](https://developer.bitmovin.com/encoding/reference/livedeletenotificationswebhooksencodingencodingsliveencodingheartbeatbyencodingidandwebhookid) Webhook for a specific encoding

To get the custom data from the webhook, use "[webhook custom data"](https://developer.bitmovin.com/encoding/reference/livegetnotificationswebhooksencodingencodingsliveencodingheartbeatcustomdatabywebhookid)<br />To get the custom data from the webhook  for a specific encoding: ["webhook custom data by encoding"](https://developer.bitmovin.com/encoding/reference/livegetnotificationswebhooksencodingencodingsliveencodingheartbeatcustomdatabyencodingidandwebhookid)

## Payload

Below is an example payload.

```json
{
  "encoding": {
    "cloudRegion": "AWS_EU_WEST_1",
    "id": "232610f5-ff80-4146-a21b-54dd123fb5fd",
    "name": "Test Live Heartbeat",
    "encoderVersion": "BETA",
    "type": "LIVE"
  },
  "webhookId": "1c03498b-0454-42d4-8f05-48ecb45fe7ee",
  "orgId": "1f4cf17c-c6a6-4e9a-8f6f-6776ebe571da",
  "resourceId": "cf9e71b5-e136-40ad-a47b-788568a4edc5",
  "resourceType": "ENCODING",
  "triggeredAt": "2024-06-14T12:15:41.489249069Z",
  "value": {
    "ingest": {
      "healthy": true,
      "status": "CONNECTED",
      "ingestPoints": [
        {
          "name": "Rtmp Main",
          "inputId": "aece64e7-291c-4427-b3bb-24da91d7a1f8",
          "inputType": "RTMP",
          "isActive": true,
          "isBackup": false
        }
      ],
      "streams": [
        {
          "bitrate": 1303552,
          "codec": "h264",
          "healthy": true,
          "incomingBitrate": 211394.43333333332,
          "lastArrivalTime": "2024-06-14T12:15:41:455Z",
          "lastTimestamp": 107858,
          "mediaType": "video",
          "rate": 23,
          "samplesReadPerSecondAvg": 23.96666666666667,
          "keyFrameIntervalMax": 8333,
          "keyFrameIntervalAvg": 4520.75,
          "keyFrameIntervalMaxLastMinute": 4200,
          "keyFrameIntervalAvgLastMinute": 4012.33,
          "streamId": "0",
          "lastTimestampTimescale": 1000,
          "height": 1080,
          "width": 1920
        },
        {
          "bitrate": 128000,
          "codec": "aac",
          "healthy": true,
          "incomingBitrate": 16609.149999999998,
          "lastArrivalTime": "2024-0-14T12:15:41:476Z",
          "lastTimestamp": 107899,
          "mediaType": "audio",
          "rate": 44100,
          "samplesReadPerSecondAvg": 44100.26666666666,
          "keyFrameIntervalMax": null,
          "keyFrameIntervalAvg": null,
          "keyFrameIntervalMaxLastMinute": null,
          "keyFrameIntervalAvgLastMinute": null,
          "streamId": "1",
          "lastTimestampTimescale": 1000,
          "height": null,
          "width": null
        }
      ],
      "rtmpUserIngestInfo": {
        "address": "82.118.2.58",
        "app": "live",
        "streamKey": "my-stream-key",
        "flashVersion": "FMLE/3.0 (compatible; Lavf58.76",
        "clientId": "38",
        "eventType": "STARTED"
      },
      "droppedPacketsVideo": 0,
      "droppedPacketsAudio": 0,
      "corruptPacketsVideo": 0,
      "corruptPacketsAudio": 0
    },
    "output": {
      "manifests": {
        "hls": [
          {
            "manifestId": "8dfca79a-1282-48fe-88a6-578bc6bba024",
            "manifestUpdateLatencyStats": {
              "mean": -1,
              "median": 3,
              "min": -3030,
              "max": 1286
            },
            "manifestUpdates": [
              {
                "manifestUpdateWallClockTime": "2024-06-14T12:15:08.682Z",
                "latestMediaPresentationTime": "2024-06-14T12:15:02.186Z",
                "manifestUpdateLatency": -1011
              },
              {
                "manifestUpdateWallClockTime": "2024-06-14T12:15:03.671Z",
                "latestMediaPresentationTime": "2024-06-14T12:14:56.191Z",
                "manifestUpdateLatency": 980
              }
            ]
          }
        ]
      },
      "segments": {
        "totalProcessingStatsMs": {
          "min": 1027,
          "max": 12247,
          "mean": 4723,
          "median": 5050
        },
        "totalProcessingOutliers": [
          {
            "segmentNumber": 12,
            "durationMs": 12247
          }
        ],
        "uploadOutliers": [
          {
            "segmentNumber": 15,
            "encodingReferenceMuxingId": "dca9c2af-334f-4728-9334-0e1dfa4fe1dc",
            "durationMs": 1250
          }
        ]
      }
    },
    "events": [
      {
        "time": "2024-06-14T11:43:14Z",
        "details": {
          "eventType": "FIRST_CONNECT",
          "message": null
        }
      },
      {
        "time": "2024-06-14T11:43:18Z",
        "details": {
          "eventType": "WARNING",
          "message": "At least one input video stream key-frame interval is larger than the threshold: 8333 ms >= 4000 ms! Output video stream may have playback issues."
        }
      }
    ]
  },
  "id": "85f0fdde-4f26-42df-bc1a-4807cc586906",
  "eventType": "LIVE_ENCODING_HEARTBEAT",
  "customData": {}
}
```

### Payload Explanation

* `encoding` : Contains information about the live encoding configuration
  * `cloudRegion`: Cloud region where the encoding is running
  * `id`: Unique identifier for the encoding
  * `name`: Name of the encoding
  * `encoderVersion`: Version of the encoder being used
  * `type`: Indicates the encoding type (that it is a live encoding)
* `webhookId`: Unique identifier for the webhook
* `orgId`: Organization ID that owns this encoding
* `resourceId`:  ID of the resource (if the resourceType is ENCODING it would refer to the encoding ID)
* `resourceType`: Type of the resource for which the webhook was fired. (e.g.: ENCODING)
* `triggeredAt`: Timestamp (ISO 8601-Format) when the heartbeat was triggered (independent from any ingest data)
* `value`: Contains the actual heartbeat data
  * `ingest`: Information about the input stream
    * `healthy`: Current health status of the ingest
    * `status`: Current status of the input stream (CONNECTED, WAITING\_FOR\_FIRST\_CONNECT, DISCONNECTED, ERROR, UNKNOWN)
    * `ingestPoints`: Details about an individual ingestPoint within the live ingest.
      * `name`: The name of the ingestPoint of the original Input resource.
      * `inputId`: Id of the original Input resource.<br />Note that multiple input points (main and backup) can be part of a single Input resource.
      * `inputType`: Type of the input, e.g. **RTMP**, **ZIXI**, **SRT**.
      * `isActive`: Indicates whether this particular input is active.
      * `isBackup`: Indicates whether this particular input is a backup input.
    * `streams`: Array of information about each stream (video/audio)<br />Each stream contains:
      * `bitrate`:  The bitrate of the input stream as it is signalled by the container format, in bits per second
      * `codec`: Codec being used (eg. h264 for video, aac for audio)
      * `healthy`: Health status of this specific stream
      * `incomingBitrate`: Average actual measured incoming bitrate (not to confuse with `bitrate` field) in bytes per second during the last minute
      * `lastArrivalTime`: Timestamp (ISO 8601-Format) when the Encoder received a media packet for a specific stream. (e.g. the last arrival time of a video packet).
      * `lastTimestamp`:  Presentation timestamp (PTS) (the time at which the decompressed packet will be presented to the user) of the last received input stream packet
      * `mediaType`: Type of media (video/audio/subtitles)
      * `rate`:  Input stream frame rate for video or input sample rate for audio
      * `samplesReadPerSecondAvg`: Average frames/samples processed per second during the last minute
      * `keyFrameIntervalMax`: The maximum interval between key frames, in milliseconds. Calculated per individual connection and reset upon reconnection.
      * `keyFrameIntervalAvg`: The average interval between key frames, in milliseconds. Calculated per individual connection and reset upon reconnection.
      * `keyFrameIntervalMaxLastMinute`: The maximum interval between key frames observed in the last minute, in milliseconds. Calculated over a rolling 60-second window and reset upon reconnection.
      * `keyFrameIntervalAvgLastMinute`: The average interval between key frames observed in the last minute, in milliseconds. Calculated over a rolling 60-second window and reset upon reconnection.
      * `streamId`: Unique identifier for this stream (0, 1, ..)
      * `lastTimestampTimescale`: Timescale for `lastTimestamp`
      * `height`: Video height in pixels (null for audio)
      * `width`: Video width in pixels (null for audio)
    * `rtmpUserIngestInfo`: Details about user info from rtmp ingest.
      * `address`: Client public IP address
      * `app`: RTMP application name
      * `streamKey`: Client stream key
      * `flashVersion`: Flash version string / encoder identity
      * `clientId`: Session/client connection ID
      * `eventType`: Server actions that indicate what the client is doing with the live stream<br />**CONNECT:** Client initiated an RTMP connection<br />**DISCONNECT:** Client disconnected from the RTMP application<br />**STARTED:** Client started publishing a live stream<br />**STOPPED:** Client stopped publishing the stream<br />**UNKNOWN:** Unrecognized or unsupported RTMP operation
    * `droppedPacketsVideo`: Number of dropped video packets since the live encoding started.
    * `droppedPacketsAudio`: Number of dropped audio packets since the live encoding started.
    * `corruptPacketsVideo`: Number of corrupt video packets since the live encoding started.
    * `corruptPacketsAudio`: Number of corrupt audio packets since the live encoding started.
  * `output`: Output statistics for a live encoding.
    * `manifests`: Manifest statistics for a live encoding.
      * `hls`: HLS manifest update monitoring data for a live encoding.
        * `manifestId`: ID of the HLS manifest.
        * `manifestUpdateLatencyStats`: Aggregate statistics of HLS manifest update latencies, in milliseconds, computed over recorded stream-advancing updates. (Please, refer `manifestUpdates`)
        * `manifestUpdates`
          * `manifestUpdateWallClockTime`: Wall-clock time the manifest update was detected, returned as UTC in ISO 8601 format: YYYY-MM-DDThh:mm:ssZ
          * `latestMediaPresentationTime`: Latest media presentation time across renditions (min of last published segment PDT + duration), returned as UTC in ISO 8601 format: YYYY-MM-DDThh:mm:ssZ
          * `manifestUpdateLatency`: Manifest update latency in milliseconds (elapsed wall-clock minus media-time advanced). Null for the first recorded update. Positive values indicate a delayed update.
    * `segments`: Segments statistics for a live encoding.
      * `totalProcessingStatsMs`: Aggregate statistics of segments' total processing time, in milliseconds, over the last 90 seconds.
      * `totalProcessingOutliers`: Collection of last 20 segments whose total processing duration exceeded twice the rolling median.
        * `segmentNumber`: Output segment number this measurement belongs to.
        * `durationMs`: Total processing duration in milliseconds.
      * `uploadOutliers`: Collection of last 20 per-muxing uploads whose duration exceeded the upload-outlier threshold of 1 second.
        * `segmentNumber`: Output segment number this measurement belongs to.
        * `encodingReferenceMuxingId`: Identifier of the muxing whose upload was flagged.
        * `durationMs`: Upload duration in milliseconds.
  * `events`: Array of Live Encoding Heartbeat events
    * `time`: Timestamp when the event was triggered.
    * `details`: Event details
      * `eventType`: Type of the event. One of the following:<br />**FIRST\_CONNECT:** First connection of the ingest<br />**DISCONNECT:** Ingest has disconnected<br />**RECONNECT:** Ingest has reconnected<br />**WARNING:** Warning occurred, please see the message for further details<br />**ERROR:** Error occurred, please see the message for further details
      * `message`: Optional message text
* `id`: Unique identifier for this heartbeat event
* `eventType`: Type of event being reported (eg. LIVE\_ENCODING\_HEARTBEAT)
* `customData`: Additional custom data