Skip to content

Webhook Sink

Class: WebhookSinkBlockV1

Source: inference.core.workflows.core_steps.sinks.webhook.v1.WebhookSinkBlockV1

The Webhook Sink block enables sending a data from Workflow into external APIs by sending HTTP requests containing workflow results. It supports multiple HTTP methods (GET, POST, PUT) and can be configured to send:

  • JSON payloads

  • query parameters

  • multipart-encoded files

This block is designed to provide flexibility for integrating workflows with remote systems for data exchange, notifications, or other integrations.

Setting Query Parameters

You can easily set query parameters for your request:

query_parameters = {
    "api_key": "$inputs.api_key",
}

will send request into the following URL: https://your-host/some/resource?api_key=<API_KEY_VALUE>

Setting headers

Setting headers is as easy as setting query parameters:

headers = {
    "api_key": "$inputs.api_key",
}

Sending JSON payloads

You can set the body of your message to be JSON document that you construct specifying json_payload and json_payload_operations properties. json_payload works similarly to query_parameters and headers, but you can optionally apply UQL operations on top of JSON body elements.

Let's assume that you want to send number of bounding boxes predicted by object detection model in body field named detections_number, then you need to specify configuration similar to the following:

json_payload = {
    "detections_number": "$steps.model.predictions",
}
json_payload_operations = {
    "detections_number": [{"type": "SequenceLength"}]
}

Multipart-Encoded Files in POST requests

Your endpoint may also accept multipart requests. You can form them in a way which is similar to JSON payloads - setting multi_part_encoded_files and multi_part_encoded_files_operations.

Let's assume you want to send the image in the request, then your configuration may be the following:

multi_part_encoded_files = {
    "image": "$inputs.image",
}
multi_part_encoded_files_operations = {
    "image": [{"type": "ConvertImageToJPEG"}]
}

Cooldown

The block accepts cooldown_seconds (which defaults to 5 seconds) to prevent unintended bursts of notifications. Please adjust it according to your needs, setting 0 indicate no cooldown.

During cooldown period, consecutive runs of the step will cause throttling_status output to be set True and no notification will be sent.

Cooldown limitations

Current implementation of cooldown is limited to video processing - using this block in context of a Workflow that is run behind HTTP service (Roboflow Hosted API, Dedicated Deployment or self-hosted inference server) will have no effect for processing HTTP requests.

Async execution

Configure the fire_and_forget property. Set it to True if you want the request to be sent in the background, allowing the Workflow to proceed without waiting on data to be sent. In this case you will not be able to rely on error_status output which will always be set to False, so we recommend setting the fire_and_forget=False for debugging purposes.

Disabling notifications based on runtime parameter

Sometimes it would be convenient to manually disable the Webhook sink block. This is possible setting disable_sink flag to hold reference to Workflow input. with such setup, caller would be able to disable the sink when needed sending agreed input parameter.

Type identifier

Use the following identifier in step "type" field: roboflow_core/webhook_sink@v1to add the block as as step in your workflow.

Properties

Name Type Description Refs
name str Enter a unique identifier for this step..
url str URL of the resource to make request.
method str HTTP method to be used.
query_parameters Dict[str, Union[List[Union[bool, float, int, str]], bool, float, int, str]] Request query parameters.
headers Dict[str, Union[bool, float, int, str]] Request headers.
json_payload Dict[str, Union[Dict[Any, Any], List[Any], bool, float, int, str]] Fields to put into JSON payload.
json_payload_operations Dict[str, List[Union[ClassificationPropertyExtract, ConvertDictionaryToJSON, ConvertImageToBase64, ConvertImageToJPEG, DetectionsFilter, DetectionsOffset, DetectionsPropertyExtract, DetectionsRename, DetectionsSelection, DetectionsShift, DetectionsToDictionary, Divide, ExtractDetectionProperty, ExtractImageProperty, LookupTable, Multiply, NumberRound, NumericSequenceAggregate, RandomNumber, SequenceAggregate, SequenceApply, SequenceLength, SequenceMap, SortDetections, StringMatches, StringSubSequence, StringToLowerCase, StringToUpperCase, ToBoolean, ToNumber, ToString]]] UQL definitions of operations to be performed on defined data w.r.t. each value of json_payload parameter.
multi_part_encoded_files Dict[str, Union[Dict[Any, Any], List[Any], bool, float, int, str]] Data to POST as Multipart-Encoded File.
multi_part_encoded_files_operations Dict[str, List[Union[ClassificationPropertyExtract, ConvertDictionaryToJSON, ConvertImageToBase64, ConvertImageToJPEG, DetectionsFilter, DetectionsOffset, DetectionsPropertyExtract, DetectionsRename, DetectionsSelection, DetectionsShift, DetectionsToDictionary, Divide, ExtractDetectionProperty, ExtractImageProperty, LookupTable, Multiply, NumberRound, NumericSequenceAggregate, RandomNumber, SequenceAggregate, SequenceApply, SequenceLength, SequenceMap, SortDetections, StringMatches, StringSubSequence, StringToLowerCase, StringToUpperCase, ToBoolean, ToNumber, ToString]]] UQL definitions of operations to be performed on defined data w.r.t. each value of multi_part_encoded_files parameter.
form_data Dict[str, Union[Dict[Any, Any], List[Any], bool, float, int, str]] Fields to put into form-data.
form_data_operations Dict[str, List[Union[ClassificationPropertyExtract, ConvertDictionaryToJSON, ConvertImageToBase64, ConvertImageToJPEG, DetectionsFilter, DetectionsOffset, DetectionsPropertyExtract, DetectionsRename, DetectionsSelection, DetectionsShift, DetectionsToDictionary, Divide, ExtractDetectionProperty, ExtractImageProperty, LookupTable, Multiply, NumberRound, NumericSequenceAggregate, RandomNumber, SequenceAggregate, SequenceApply, SequenceLength, SequenceMap, SortDetections, StringMatches, StringSubSequence, StringToLowerCase, StringToUpperCase, ToBoolean, ToNumber, ToString]]] UQL definitions of operations to be performed on defined data w.r.t. each value of form_data parameter.
request_timeout int Number of seconds to wait for remote API response.
fire_and_forget bool Boolean flag dictating if sink is supposed to be executed in the background, not waiting on status of registration before end of workflow run. Use True if best-effort registration is needed, use False while debugging and if error handling is needed.
disable_sink bool boolean flag that can be also reference to input - to arbitrarily disable data collection for specific request.
cooldown_seconds int Number of seconds to wait until follow-up notification can be sent.

The Refs column marks possibility to parametrise the property with dynamic values available in workflow runtime. See Bindings for more info.

Available Connections

Compatible Blocks

Check what blocks you can connect to Webhook Sink in version v1.

Input and Output Bindings

The available connections depend on its binding kinds. Check what binding kinds Webhook Sink in version v1 has.

Bindings
Example JSON definition of step Webhook Sink in version v1
{
    "name": "<your_step_name_here>",
    "type": "roboflow_core/webhook_sink@v1",
    "url": "<block_does_not_provide_example>",
    "method": "<block_does_not_provide_example>",
    "query_parameters": {
        "api_key": "$inputs.api_key"
    },
    "headers": {
        "api_key": "$inputs.api_key"
    },
    "json_payload": {
        "field": "$steps.model.predictions"
    },
    "json_payload_operations": {
        "predictions": [
            {
                "property_name": "class_name",
                "type": "DetectionsPropertyExtract"
            }
        ]
    },
    "multi_part_encoded_files": {
        "image": "$steps.visualization.image"
    },
    "multi_part_encoded_files_operations": {
        "predictions": [
            {
                "property_name": "class_name",
                "type": "DetectionsPropertyExtract"
            }
        ]
    },
    "form_data": {
        "field": "$inputs.field_value"
    },
    "form_data_operations": {
        "predictions": [
            {
                "property_name": "class_name",
                "type": "DetectionsPropertyExtract"
            }
        ]
    },
    "request_timeout": "$inputs.request_timeout",
    "fire_and_forget": "$inputs.fire_and_forget",
    "disable_sink": false,
    "cooldown_seconds": "$inputs.cooldown_seconds"
}