Everything you need to define, version, and execute multi-step AI workflows. Plain JSON, REST API, zero vendor lock-in.
A Waiflo file is a plain JSON document with three top-level keys. It is designed to be committed to Git, reviewed in a pull request, and deployed as any other artifact.
{ "lang_name": "my_pipeline", // unique identifier for this pipeline "steps": [ ... ], // reusable step definitions "workflows": [ ... ] // DAGs that wire steps together }
| Field | Type | Description |
|---|---|---|
| lang_name | string | Unique name for the pipeline. Used as the file name on disk. required |
| steps | Step[] | Array of step definitions. Each step is an atomic, reusable unit. required |
| workflows | Workflow[] | Array of workflow definitions (DAGs). Each workflow wires steps into an execution graph. optional |
A step is the atomic unit of a pipeline. It has a type, typed I/O schemas, and its full configuration in one object — no hidden state, no magic inheritance.
| Field | Type | Description |
|---|---|---|
| ws_name | string | Unique identifier within the file. Used to reference the step in workflows. required |
| ws_type | string | One of: prompt · api · transform · tool · script required |
| ws_inputs_schema | JSONSchema | JSON Schema object describing expected inputs. optional |
| ws_output_schema | JSONSchema | JSON Schema object describing the expected output. optional |
The ws_llm object configures which model to call. ws_prompt_template supports Mustache triple-stache {{{var}}} for raw injection and {{var}} for HTML-escaped values.
| Field | Type | Description |
|---|---|---|
| ws_llm.provider | string | LLM provider. Currently: anthropic. |
| ws_llm.model | string | Model ID e.g. claude-sonnet-4-20250514. |
| ws_llm.temperature | number | 0–1. Defaults to 0. optional |
| ws_system_prompt | string | System prompt string. Injected before the user turn. |
| ws_prompt_template | string | User turn template. Supports {{input_var}} and {{ws_output_schema}} substitutions. |
{ "ws_name": "classify", "ws_type": "prompt", "ws_llm": { "provider": "anthropic", "model": "claude-sonnet-4-20250514", "temperature": 0 }, "ws_system_prompt": "You are a classifier. Reply with JSON only.", "ws_prompt_template": "Classify: \nSchema: ", "ws_inputs_schema": { "required": ["input_text"] }, "ws_output_schema": { "properties": { "label": { "type": "string" } } } }
URL and body templates support {{input_var}} substitution resolved from inputs at runtime.
| Field | Type | Description |
|---|---|---|
| ws_api.method | string | HTTP method: GET · POST · PUT · PATCH · DELETE. |
| ws_api.url | string | URL string. Supports {{input_var}} template substitution. |
| ws_api.headers | object | Static or templated headers object. optional |
| ws_api.body | object | Request body. Object or string. optional |
A workflow is a named directed acyclic graph (DAG) of step references. The runtime resolves execution order from depends_on declarations.
| Field | Type | Description |
|---|---|---|
| wf_name | string | Unique workflow name. required |
| wf_nodes | Node[] | Ordered array of node objects, each referencing a step by step_id. required |
| Field | Type | Description |
|---|---|---|
| step_id | string | References a ws_name defined in the steps array. |
| depends_on | string[] | Array of step_id values that must complete before this node runs. Data passed downstream comes explicitly from ws_output_schema fields (no implicit aliases). optional |
{ "wf_name": "triage_and_respond", "wf_nodes": [ { "step_id": "classify_ticket" }, { "step_id": "enrich_customer", "depends_on": ["classify_ticket"] }, { "step_id": "draft_response", "depends_on": ["classify_ticket", "enrich_customer"] } ] }
Download the full Waiflo API OpenAPI YAML schema and import it into Postman, Insomnia, or your internal tooling.
GET /json_schemas/waiflo_api.openapi.yaml
The exec API runs a single step with provided inputs. No account required for guest use if ANTHROPIC_API_KEY is set in the server environment. Authenticated users bring their own encrypted API key.
// Request body { "step": { ... }, // full step definition object "inputs": { ... } // key-value map of inputs } // Response // prompt step → SSE stream data: {"type":"delta","text":"..."} data: {"type":"final","output":{"label":"billing"}} // api step → JSON { "output": { "status": 200, "body": { ... } } }
JWT-based authentication. Tokens are valid for 7 days. Pass the token in the Authorization header for all authenticated endpoints.
{ "email": "you@example.com", "password": "min8chars" } // → { "token": "eyJ..." }
{ "email": "you@example.com", "password": "..." } // → { "token": "eyJ..." }
Include the JWT token in all requests that require authentication.
Authorization: Bearer <token>
CRUD endpoints for managing workflow files on the server. PATCH endpoints use recursive deep merge — only the fields you send are updated. Built for autosave and AI-assisted pipeline builders.
{ "workflow_name": "triage", "ws_name": "classify", "patch": { "ws_llm": { "temperature": 0.4 } } }
Only ws_llm.temperature is changed. ws_llm.provider and ws_llm.model are preserved automatically.
Self-host with Docker. Zero external services — just a JWT secret and your Anthropic key.