Send HTTP Webhook

Send metadata, snapshots, clips from the pipeline to a HTTP endpoint / API at a periodic interval or based on a trigger.

Overview

Send HTTP Webhook node sends pipeline metadata to a Web service periodically or when a trigger condition is met.

Inputs & Outputs

  • Inputs : 1, Media Format : Any
  • Outputs : 1, Media Format: Same as Input
  • Output Metadata : None

Properties

PropertyDescriptionTypeDefaultRequired
trigger_typeWhen to collect metadata. Options: custom_trigger, auto_trigger, periodic, startup, shutdown. Auto Trigger is when significant node properties change.enumauto_triggertrue
triggerCustom trigger condition. Send a webhook when this condition evaluates to true. Conditional on trigger_type being custom_triggertrigger-conditionnullfalse
intervalPublish interval in seconds. How frequently to send webhook. Set to 0 to publish every time metadata is collected.number0true
webhook_urlPOSTs to this URL directly from the Gatewaystringnulltrue
formatWebhook format. Options: application_json, form_multipart, custom_body_post, http_getenumapplication_jsontrue
metadata_filter_patternsComma separated list of metadata patterns to keep in the JSON body of the webhookmetadata-listnullfalse
custom_body_templateUse Jinja2 template syntax to customize the body of the POST request. Conditional on format being custom_body_posttext{}true
json_formatMetadata JSON format. Options:
dynamic_keys : Dynamic Keys uses certain attributes (such as ROI names) as keys, useful for JSON Path operations.
static_keys : Static Keys converts all such attributes to a named static key.
enumdynamic_keystrue
include_frame_metadataAttach frame metadata. Conditional on format being form_multipartbooltruefalse
include_snapshotAttach frame snapshot. Conditional on format being form_multipartboolfalsefalse
include_object_snapshotsAttach snapshots for all matching objects from the time the trigger happened with the webhook. Conditional on format being form_multipartmodel-labelnullfalse
clip_nodeAttach the most recent clip from the named Save Clip node with the webhook. Conditional on format being form_multipartnodenullfalse
include_clip_metadataAttaches metadata from the clip along with the media. Conditional on format being form_multipartboolfalsefalse
max_media_wait_timeMax. wait time until media clip is available in seconds. Conditional on format being form_multipartnumber10false
authAuthentication method. Options: none, basic, digestenumnonefalse
usernameUsername for authenticationstringnullfalse
passwordPassword for authenticationstringnullfalse
extra_headersComma separated list of headers to insert into the request. Format: HeaderName:HeaderValue. Ex Authorization:Bearer xad32248fhsad, X-Extra-Header:Foostringnullfalse
max_retriesMaximum number of times to retry in case of failurenumber3false
compressionIf true, enable GZIP content-encoding for the webhook data. ex. true / false
Note: This is only applied to this Frame's metadata, not any other attachments in case of Form Multipart POST format
booltruefalse
debugLog debug messages?boolfalsefalse

Webhook Format

JSON POST

When format is set to application_json, the contents of the Frame's metadata (see Frame Metadata section below) are sent as the body of a POST request made to the webhook_url.

Form Multipart POST

When format is set to form_multipart, the POST request to the webhook_url can contain one or more of the following "files" when the corresponding settings are enabled in the node settings.

KeyFileNameFile Contents
metadatameta.json (or meta.json.gz if compression is enabled)Contains the contents of the triggering Frame's Metadata described below.

Maximum 1 per POST request.
snapshotsnapshot.jpgContains the snapshot from the frame when the webhook was triggered.
clip<capture-timestamp>.mp4Media Clip generated by a Save Clip Node
clipmetadata<capture-timestamp>.mp4.jsonMetadata corresponding to the entire Media Clip, in the same format as described below.

Frame Metadata

This section describes the format of each Frame's metadata that is sent in the webhook.

KeyValue
version1 : Dynamic Keys
2 : Static Keys
deployment_idThe deployment ID of the deployment that produced this metadata.
metaContains Metadata object, a dictionary of timestamp - frame level metadata pairs.
meta.<relative_timestamp>Contains Frame level metadata for a frame with this timestamp (relative to start of stream).

This metadata is a set of key-value pairs containing metadata from each node in the pipeline up until the Webhook node, so exact properties will vary.

If batch property of the Webhook node is set to True, the meta element will contain multiple frame's metadata, each with it's own timestamp.
{
    "version": 1,
    "deployment_id": "6372b7e6-e5d6-45b8-b31b-c400a3754ff4",
    "meta": {
        "0:06:40": {
          	"timestamp": "2022-11-04T23:41:34.036574Z",
            "nodes": {
                "video1":{
                  "type": "video_source", 
                  "source_id": "6372b7e6-e5d6-45b8-b31b-c400a3754ff4", 
                  "source_name": "Milestone-AXIS P1455-LE (172.16.0.38) - Camera 1", 
                  "source_type": "stream",     
                  "uri": "rtsp://172.16.0.45:554/live/658040e2-fe47-4d4b-9a27-2217af4c4193"
                },              
                "annotate_presence1": {
                    "type": "annotate_presence",
                    "rois": {
                        "roi1": {
                            "coords": [[1,1], 
                                       [100,100], 
                                       [200,200]],
                            "total_objects": 2,
                            "objects_entered_delta": 1,
                            "objects_exited_delta": 0,
                            "objects_above_max_time_threshold_count": 1,
                            "current_objects_count": 2,
                            "current_objects": {
                                "15069984211300461000": {
                                    "first_seen": 20,
                                    "time_present": 3600
                                },
                                "1506998428100461000": {
                                    "first_seen": 22,
                                    "time_present": 20
                                }                          
                            }
                        }
                    }
                }
            },
            "objects": [
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 236.29208374023438,
                        "height": 15.62222957611084,
                        "left": 339.904052734375,
                        "width": 31.91175079345703
                    },
                    "id": 1506998428100461000,
                    "label": "car"
                },
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 250.60275268554688,
                        "height": 19.088224411010742,
                        "left": 235.5812530517578,
                        "width": 35.78194046020508
                    },
                    "id": 1506998428100461000,
                    "label": "car"
                },
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 447.784912109375,
                        "height": 244.92181396484375,
                        "left": 0,
                        "width": 158.60867309570312
                    },
                    "id": 1506998428100460500,
                    "label": "car"
                },
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 495.3921813964844,
                        "height": 205.00851440429688,
                        "left": 427.19415283203125,
                        "width": 135.38002014160156
                    },
                    "id": 1506998428100460500,
                    "label": "car"
                },
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 518.0147705078125,
                        "height": 194.1524200439453,
                        "left": 239.1914825439453,
                        "width": 158.16836547851562
                    },
                    "id": 1506998428100460500,
                    "label": "car"
                },
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 538.0975952148438,
                        "height": 173.88412475585938,
                        "left": 96.46807098388672,
                        "width": 154.6107940673828
                    },
                    "id": 1506998428100461000,
                    "label": "car"
                }
            ],

        }
    }
}
{
    "version": 2,
    "deployment_id": "6372b7e6-e5d6-45b8-b31b-c400a3754ff4",
    "meta": [
        {
            "relative_timestamp": "0:06:40",
            "timestamp": "2022-11-04T23:41:34.036574Z",
            "nodes": [
                {
                    "id": "video1",
                    "type": "video_source", 
                    "source_id": "6372b7e6-e5d6-45b8-b31b-c400a3754ff4", 
                    "source_name": "Milestone-AXIS P1455-LE (172.16.0.38) - Camera 1", 
                    "source_type": "stream",     
                    "uri": "rtsp://172.16.0.45:554/live/658040e2-fe47-4d4b-9a27-2217af4c4193"
                },              
                {
                    "id": "annotate_presence1",
                    "type": "annotate_presence",
                    "rois": [
                        {
                            "label": "roi1",
                            "coords": [[1,1], 
                                        [100,100], 
                                        [200,200]],
                            "total_objects": 2,
                            "objects_entered_delta": 1,
                            "objects_exited_delta": 0,
                            "objects_above_max_time_threshold_count": 1,
                            "current_objects_count": 2,
                            "current_objects": [
                                {
                                    "id": "15069984211300461000",
                                    "first_seen": 20,
                                    "time_present": 3600
                                },
                                {
                                    "id": "1506998428100461000",
                                    "first_seen": 22,
                                    "time_present": 20
                                }                          
                            ]
                        }
                    ]
                }
            ],
            "objects": [
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 236,
                        "height": 15,
                        "left": 339,
                        "width": 31
                    },
                    "id": 1506998428100461000,
                    "label": "car"
                },
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 250,
                        "height": 19,
                        "left": 235,
                        "width": 35
                    },
                    "id": 1506998428100461000,
                    "label": "car"
                },
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 447,
                        "height": 244,
                        "left": 0,
                        "width": 158
                    },
                    "id": 1506998428100460500,
                    "label": "car"
                },
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 495,
                        "height": 205,
                        "left": 427,
                        "width": 135
                    },
                    "id": 1506998428100460500,
                    "label": "car"
                },
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 518,
                        "height": 194,
                        "left": 239,
                        "width": 158
                    },
                    "id": 1506998428100460500,
                    "label": "car"
                },
                {
                    "attributes": [],
                    "probability": -0.10000000149011612,
                    "class_id": 0,
                    "rect": {
                        "top": 538,
                        "height": 173,
                        "left": 96,
                        "width": 154
                    },
                    "id": 1506998428100461000,
                    "label": "car"
                }
            ]
        }
    ]
}

Custom Body POST

When format is set to custom_body_post, the contents of custom_body_template are sent as the body of a POST request made to the webhook_url.
custom_body_template uses Jinja2 Template Syntax for customizing the body of the POST request.

Variables available to the template:

VariableDescription
metaOriginal webhook metadata in JSON format. This contains the contents of the metadata as per the Frame Metadata section above.
application_idThe application ID of the deployment that produced this metadata.
application_nameThe application name of the deployment that produced this metadata.
deployment_idThe deployment ID of the deployment that produced this metadata.
deployment_nameThe deployment name of the deployment that produced this metadata.
gateway_idThe gateway ID of the deployment that produced this metadata.
gateway_nameThe gateway name of the deployment that produced this metadata.

Example templates

Static text content:

Text content

Reference specific metadata (when used with json_format set to static_keys):

{ "deployment_id": "{{ deployment_id }}", "source_id": "{{ meta['meta'][0]['nodes'][0]['source_id'] }}" }

Metadata reinserted as is:

{{ meta | tojson }}

Metadata

This node does not add any new metadata to the frame.

Metadata PropertyDescription
NoneNone