Outbound Webhook Step

Send HTTP requests to external endpoints as part of a workflow, and optionally map response fields into later steps.

The Outbound Webhook step sends an HTTP request to an external endpoint during a workflow. Use it to push data to a third-party API, trigger actions in other systems, or upload files. When waitForResponse is enabled, the step can expose response fields for mapping in later steps.

For the mapping placeholder syntax, see Mapping.

Configuration

nametyperequireddescription
requestobjectyesThe HTTP request to send. See Request below.
waitForResponsebooleannoWhen true, the workflow waits for the HTTP response before continuing. Default: false.
continueOnErrorbooleannoWhen true, the workflow continues even if the external service returns an error. Default: false.
listeningModeEnabledbooleannoWhen true, exposes mappableFields for downstream mapping. Default: false.
requestPayloadstringnoExample request payload for design-time documentation. Default: empty string.
responsePayloadstringnoExample response payload for design-time documentation. Default: empty string.
mappableFieldsarraynoFields extracted from the response that can be mapped in later steps. Default: empty array.

Request

The request object defines the HTTP call to make.

nametyperequireddescription
methodstringyesHTTP method: GET, POST, PUT, or DELETE.
urlstringyesThe endpoint URL. Supports path placeholders like :userId.
authenticationobjectyesAuthentication settings. See Authentication below.
pathParamsarraynoPath parameter substitutions. Each item has key and value (supports mapping).
queryParamsarraynoQuery string parameters. Each item has key and value (supports mapping).
headersarraynoCustom HTTP headers. Each item has key and value (supports mapping).
bodyobjectvariesRequest body. See Body modes below. Required for POST and PUT; optional for DELETE; not allowed for GET.

Authentication

nametyperequireddescription
typestringyesNONE (no authentication) or AUTHENTICATED (uses a stored connection).
connectionIdstringyesReference to a stored connection. Set to null when type is NONE.

Body modes

The request body format is determined by the requestMode field.

RAW

Send raw content as JSON or plain text. String values support mapping placeholders.

nametyperequireddescription
requestModestringyesMust be RAW.
contentTypestringyesJSON or TEXT.
contentstring or objectnoThe body content. When contentType is JSON, can be a string or a JSON object with mapping-supported string values.

MULTIPART

Send form data as multipart content. Useful for forms with mixed text and file fields.

nametyperequireddescription
requestModestringyesMust be MULTIPART.
contentarrayyesKey-value pairs for form fields. Each item has key and value (supports mapping).

RAW_BINARY

Send a file as the raw request body. The file can be a static reference or a mapping placeholder.

nametyperequireddescription
requestModestringyesMust be RAW_BINARY.
rawBinaryFilevariesyesA file object or a mapping placeholder (e.g. {{Form.uploadedDocument}}). See File object below.

File object

Use a file object when referencing a specific file by ID or download URL (rather than a mapping placeholder).

nametyperequireddescription
idstringyes (variant A)File identifier. Use either id or downloadUrl, not both.
downloadUrlstringyes (variant B)File download URL. Use either id or downloadUrl, not both.
namestringyesFile name.
metadataobjectnoOptional file metadata: contentType, size, createdAt, updatedAt.

Mappable fields

When listeningModeEnabled is true, you can define fields from the response that become available for mapping in later steps.

nametyperequireddescription
keystringyesField key as it appears in the response JSON.
labelstringyesHuman-readable label (used in the UI).
typestringyesData type (e.g. string, number, boolean).
exampleValuevariesnoExample value for design-time documentation and testing.

Examples

Let's start with the simplest case: a GET request with no authentication or body.

{
  "request": {
    "method": "GET",
    "url": "https://api.example.com/users",
    "authentication": { "type": "NONE", "connectionId": null }
  }
}

Here's a POST request with a raw JSON body.

{
  "request": {
    "method": "POST",
    "url": "https://api.example.com/webhook",
    "authentication": { "type": "NONE", "connectionId": null },
    "body": {
      "requestMode": "RAW",
      "contentType": "JSON",
      "content": "{\"message\": \"Hello\"}"
    }
  }
}

Building on that, here's a full POST example with an authenticated connection, path and query parameters, a JSON object body with mapping placeholders, and response fields exposed for downstream mapping.

{
  "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" }
  ]
}

Here's a multipart request—useful for submitting form data alongside a file.

{
  "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" }
      ]
    }
  }
}

To upload a file as the raw body, use RAW_BINARY. You can reference a file by object or use a mapping placeholder.

{
  "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
        }
      }
    }
  }
}
{
  "request": {
    "method": "PUT",
    "url": "https://api.example.com/files",
    "authentication": { "type": "NONE", "connectionId": null },
    "body": {
      "requestMode": "RAW_BINARY",
      "rawBinaryFile": "{{`Form`.`uploadedDocument`}}"
    }
  }
}

Finally, here's a DELETE request with an 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\"}"
    }
  }
}