Pipeline Format
Pipelines are defined in YAML or JSON. Each pipeline has a name, optional variables, an input schema, a list of steps, and output delivery configuration.
POST /api/pipelines/validate Pipeline definition
The top-level fields of a pipeline definition:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Pipeline name, used in logs and UI |
description | string | No | Human-readable description |
version | integer | Yes | Schema version (currently 1) |
variables | object | No | 'Global variables accessible via <code>{{vars.xxx}}</code>' |
input | object | No | Input schema for trigger-time data |
steps | array | Yes | Ordered list of pipeline steps |
Step types
Each step in a pipeline has a type that determines how it executes. The default type is llm.
| Type | Description |
|---|---|
llm | Default. Sends prompt to a model and returns text output. |
transform | No model call. Manipulate data with JSON extract, regex, or templates. |
condition | Branch based on previous step output. |
parallel | Run multiple steps concurrently and merge results. |
webhook | Call an external HTTP endpoint. |
human_review | Pause pipeline and wait for human approval before continuing. |
code | Run sandboxed Python or JavaScript code on the output. |
Variable interpolation
Use Handlebars-like syntax to reference data in prompts and configurations. Variables are resolved at execution time.
| Syntax | Description |
|---|---|
{{input.xxx}} | Trigger-time inputs from the user |
{{vars.xxx}} | Pipeline-level global variables |
{{steps.<id>.output}} | Full output from a previous step |
{{steps.<id>.output.field}} | JSON field access on step output |
{{env.xxx}} | User-defined encrypted secrets |
{{#if condition}}...{{/if}} | Conditional blocks (Handlebars-like) |
Output delivery
Configure where the final pipeline output gets delivered. Multiple delivery targets can be specified.
If input.schema is defined, inbound webhook payloads are validated and invalid payloads are rejected with 422.
For outbound webhooks, add signing_secret_name so receivers can verify signatures.
output:
from: summarize
deliver:
- type: webhook
url: https://example.com/stepiq/webhook
method: POST
signing_secret_name: WEBHOOK_SIGNING_SECRET Webhook
POST to any URL with a signed JSON envelope. Set signing_secret_name on the delivery target and store the secret in user or pipeline secrets.
Send output via email with configurable subject and recipients.
API Response
Return output directly in the API response body.