Outbound Webhook Step
Sends HTTP requests to external endpoints as part of a workflow. Use this step to integrate with third-party APIs, push data to external systems, or trigger actions in other services.
Top-level properties
| name | type | required | constraints |
|---|---|---|---|
request | Request | yes | See Request Object below |
listeningModeEnabled | boolean | no | default: false |
requestPayload | string | no | Example request payload for design-time testing |
responsePayload | string | no | default: empty string; example response payload for design-time |
mappableFields | array[ExtractedField] | no | default: empty array |
waitForResponse | boolean | no | default: false |
Notes
listeningModeEnabledtoggles whether the step exposesmappableFieldsfor downstream mapping.requestPayloadstores an example request payload for design-time testing and documentation purposes.responsePayloadstores an example response payload (default: empty string) for design-time testing and documentation purposes.waitForResponsedetermines if the workflow should wait for the HTTP response before continuing.mappableFieldsdescribe fields extracted from the response that can be mapped in later steps.
When to use
- Send data to, and pull data in from, external APIs using GET, POST, PUT, or DELETE methods
- Upload files to external endpoints using binary or multipart requests
- Integrate with services that do not have a dedicated workflow step
- Extract and map response fields for use in downstream steps
Request Object
Base properties shared by all HTTP methods.
| name | type | required | constraints |
|---|---|---|---|
method | string | yes | enum: GET, POST, PUT, DELETE |
url | string | yes | Supports path placeholders like {userId} |
authentication | Authentication | yes | See Authentication below |
pathParams | array[KeyValueMapping] | no | Path parameter substitutions |
queryParams | array[KeyValueMapping] | no | Query string parameters |
headers | array[KeyValue] | no | Custom HTTP headers |
body | RequestBody | varies | See Body Requirements below |
KeyValueMapping
| name | type | required | constraints |
|---|---|---|---|
key | string | yes | |
value | string | yes | Supports mapping syntax |
KeyValue (for headers)
| name | type | required | constraints |
|---|---|---|---|
key | string | yes | |
value | string | yes |
Note: Unlike pathParams and queryParams, headers do not support mapping placeholders and must be static string values.
Body Requirements by Method
| method | body |
|---|---|
GET | Not allowed |
POST | Required |
PUT | Required |
DELETE | Optional |
Authentication
| name | type | required | constraints |
|---|---|---|---|
type | string | yes | enum: NONE, AUTHENTICATED |
connectionId | string or null | yes | Reference to a stored connection |
Notes
NONEindicates no authentication is applied.AUTHENTICATEDuses a pre-configured connection identified byconnectionId.
Request Body Modes
The body field uses a discriminated union based on requestMode.
RAW Mode
Send raw content as JSON or plain text.
| name | type | required | constraints |
|---|---|---|---|
requestMode | string | yes | literal: RAW |
contentType | string | yes | enum: JSON, TEXT |
content | string or object | no | Supports mapping placeholders |
Notes
- When
contentTypeisJSON,contentcan be a string with mapping placeholders, a JSON object with nested values (all string values support mapping), or omitted entirely. - When
contentTypeisTEXT,contentmust be a string (with mapping support) or omitted. - String values support
{{Step.Field}}mapping placeholders.
MULTIPART Mode
Send form data as multipart content.
| name | type | required | constraints |
|---|---|---|---|
requestMode | string | yes | literal: MULTIPART |
content | array[KeyValueMapping] | yes | Key-value pairs for form fields |
RAW_BINARY Mode
Send a file as the raw request body.
| name | type | required | constraints |
|---|---|---|---|
requestMode | string | yes | literal: RAW_BINARY |
rawBinaryFile | ContextFile or mapping | yes | File to upload (can be a ContextFile object or a mapping placeholder) |
ContextFile
ContextFile has two variants. Use variant A (with id) or variant B (with downloadUrl), not both.
| name | type | required | notes |
|---|---|---|---|
id | string | yes (variant A only) | Required if using variant A |
downloadUrl | string | yes (variant B only) | Required if using variant B |
name | string | yes | |
metadata | FileMetadata | no |
FileMetadata
| name | type | required |
|---|---|---|
contentType | string | no |
size | number | no |
createdAt | string | no |
updatedAt | string | no |
ExtractedField
Fields extracted from the response for downstream mapping.
| name | type | required |
|---|---|---|
key | string | yes |
label | string | yes |
type | string | yes |
exampleValue | string, number, boolean, or null | no |
Mapping Format
String values throughout the configuration support dynamic placeholders using the format:
{{`StepName`.`FieldName`}}
For example: {{Form.userName}} or {{DataCapture.email}}
Minimal example (JSON) — GET
{
"request": {
"method": "GET",
"url": "https://api.example.com/users",
"authentication": { "type": "NONE", "connectionId": null }
}
}Minimal example (JSON) — POST with RAW body
{
"request": {
"method": "POST",
"url": "https://api.example.com/webhook",
"authentication": { "type": "NONE", "connectionId": null },
"body": {
"requestMode": "RAW",
"contentType": "JSON",
"content": "{\"message\": \"Hello\"}"
}
}
}Full example (JSON) — POST with JSON object body
{
"request": {
"method": "POST",
"url": "https://api.example.com/users/{userId}",
"authentication": { "type": "AUTHENTICATED", "connectionId": "my-api-connection" },
"pathParams": [
{ "key": "userId", "value": "{{`Form`.`userId`}}" }
],
"queryParams": [
{ "key": "format", "value": "json" }
],
"headers": [
{ "key": "X-Custom-Header", "value": "custom-value" }
],
"body": {
"requestMode": "RAW",
"contentType": "JSON",
"content": {
"name": "{{`Form`.`userName`}}",
"email": "{{`Form`.`userEmail`}}",
"metadata": {
"source": "workflow",
"requestId": "{{`Form`.`requestId`}}"
}
}
}
},
"waitForResponse": true,
"listeningModeEnabled": true,
"mappableFields": [
{ "key": "id", "label": "User ID", "type": "string", "exampleValue": "usr-12345" },
{ "key": "status", "label": "Status", "type": "string", "exampleValue": "created" }
]
}Example (JSON) — MULTIPART body
{
"request": {
"method": "POST",
"url": "https://api.example.com/submit",
"authentication": { "type": "NONE", "connectionId": null },
"body": {
"requestMode": "MULTIPART",
"content": [
{ "key": "name", "value": "{{`Form`.`userName`}}" },
{ "key": "description", "value": "Static description" }
]
}
}
}Example (JSON) — RAW_BINARY file upload
{
"request": {
"method": "POST",
"url": "https://api.example.com/upload",
"authentication": { "type": "AUTHENTICATED", "connectionId": "file-api" },
"body": {
"requestMode": "RAW_BINARY",
"rawBinaryFile": {
"id": "file-123",
"name": "document.pdf",
"metadata": {
"contentType": "application/pdf",
"size": 1024000
}
}
}
}
}Example (JSON) — RAW_BINARY with mapped file
{
"request": {
"method": "PUT",
"url": "https://api.example.com/files",
"authentication": { "type": "NONE", "connectionId": null },
"body": {
"requestMode": "RAW_BINARY",
"rawBinaryFile": "{{`DataCapture`.`uploadedDocument`}}"
}
}
}Example (JSON) — DELETE with optional body
{
"request": {
"method": "DELETE",
"url": "https://api.example.com/resources/{resourceId}",
"authentication": { "type": "AUTHENTICATED", "connectionId": "api-connection" },
"pathParams": [
{ "key": "resourceId", "value": "{{`Form`.`resourceId`}}" }
],
"body": {
"requestMode": "RAW",
"contentType": "JSON",
"content": "{\"reason\": \"cleanup\"}"
}
}
}Updated about 7 hours ago
