
Ashby Triggers Webhook
CertifiedReceive signed Ashby webhooks
Ashby Triggers Webhook
Receive signed Ashby webhooks
Verifies the Ashby HMAC signature, then delegates execution creation and submission to Kestra. The payload is available in trigger.body and headers in trigger.headers.
type: io.kestra.plugin.ashby.triggers.WebhookExamples
Receive an Ashby webhook
id: ashby_webhook
namespace: company.team
tasks:
- id: log
type: io.kestra.plugin.core.log.Log
message: "{{ trigger.body }}"
triggers:
- id: ashby
type: io.kestra.plugin.ashby.triggers.Webhook
key: "{{ secret('ASHBY_WEBHOOK_KEY') }}"
signingSecret: "{{ secret('ASHBY_SIGNING_SECRET') }}"
Installation
Our standard Docker images already include this plugin. If you use a -slim image or another setup, install it with the following command:
kestractl plugins get io.kestra.plugin:plugin-ashby --compatible-for $KESTRA_VERSION For kestractl, use your Kestra version with --compatible-for, or specify an exact plugin version.
For Kestra CLI, replace LATEST with a specific version or version range to pin the plugin version.
Properties
key *string
1256The unique key that will be part of the URL.
The key is used for generating the webhook URL.
::alert{type="warning"} Make sure to keep the webhook key secure. It's the only security mechanism to protect your endpoint from bad actors, and must be considered as a secret. You can use a random key generator to create the key. ::
signingSecret *string
Webhook signing secret
Required secret configured in Ashby. Ashby-Signature must contain sha256= followed by the lowercase hexadecimal HMAC-SHA256 digest of the raw request body.
allowConcurrent boolean
falseSpecifies whether a trigger is allowed to start a new execution even if a previous run is still in progress.
fetchType string
FETCHNONEFETCHSTOREWhat the trigger does with the body of the webhook request.
FETCH: the body reaches the flow on thebodyoutput. A JSON body is deserialized, a binary one is base64-encoded. This is the default, and how a webhook has always behaved.STORE: the body is streamed into Kestra's internal storage as it is received, and the flow reaches it through theurioutput. Nothing of it travels through the execution, so this is the option to use for a large or binary payload - but note that a condition on the trigger can no longer read the body.NONE: the body is read off the connection and dropped. Use it for a caller whose payload the flow does not need.
This only concerns the body of a request. The file parts of a multipart/form-data request are always stored in the internal storage and exposed on parts, whatever this property is set to, as a file part has no meaningful representation inside an execution.
inputs object
The inputs to pass to the triggered flow
responseCode integerstring
Custom response code.
If set, the webhook response code will use this response code instead of the default 200.
Requires wait and returnOutputs to be true.
responseContentType string
application/jsontext/plainCustom response content type.
If set, the webhook response will use this content type instead of the default application/json.
Requires wait and returnOutputs to be true.
This is useful for webhook validation handshakes that require specific content types (e.g., Microsoft Graph Change Notifications require text/plain responses).
returnOutputs boolean
falseSend outputs of the flows as response for webhook caller.
Requires wait to be true.
stopAfter array
CREATEDSUBMITTEDRUNNINGPAUSEDRESTARTEDKILLINGSUCCESSWARNINGFAILEDKILLEDCANCELLEDQUEUEDRETRYINGRETRIEDSKIPPEDBREAKPOINTRESUBMITTEDList of execution states after which a trigger should be stopped (a.k.a. disabled).
wait boolean
falseWait for the flow to finish.
If set to true the webhook call will wait for the flow to finish and return the flow outputs as response.
If set to false the webhook call will return immediately after the execution is created.
when string
trueA condition that determines whether the trigger should run.
A Pebble expression evaluated at trigger time. The trigger fires only when the expression evaluates to a truthy value (true, a non-empty string, a non-zero number). Use this to gate trigger execution on dynamic runtime values such as execution labels, flow variables, or environment conditions.
Outputs
body *object
The full body for the webhook request
We try to deserialize the incoming request as JSON (array or object).
If we can't deserialize, the full body will be available as a string.
A binary body - one whose content type is neither text, JSON, XML, form-urlencoded, YAML nor CSV - is base64-encoded, as base64 is how bytes travel through the text-based trigger variables. Use the content-type request header to tell a base64-encoded body apart from a plain text one.
Only set for a trigger whose fetchType is FETCH, and not for a multipart/form-data request, which is available as parts and formFields.
headers *object
The headers for the webhook request
parameters *object
The parameters for the webhook request
formFields object
The form fields of a multipart/form-data webhook request
Only set for a multipart/form-data request; holds the parts that are not files.
parts array
The file parts of a multipart/form-data webhook request
Only set for a multipart/form-data request. The content of each part is stored in Kestra's internal storage, and the part carries its URI.
A file part of a `multipart/form-data` webhook request
The content type of the part
Not set if the caller did not send one for this part.
The name of the uploaded file
The form field name of the part
The size of the part content in bytes
The URI of the part content in Kestra's internal storage
The content of the part is streamed to the internal storage as it is received, so that a file of any size reaches the flow intact and without travelling through the execution. It is stored under the execution the webhook call creates, and purged with it.
uri string
The URI of the body of the webhook request in Kestra's internal storage
Only set for a trigger whose fetchType is STORE. The body is streamed to the internal storage as it is received, so that a payload of any size reaches the flow intact and without travelling through the execution. It is stored under the execution the webhook call creates, and purged with it.