Deploying Workflows
Beyond internal automation, any workflow can be exposed as a public API endpoint, a chat widget, or run in bulk over a dataset for evaluation.
Public API keys
Generate a workflow-scoped API key to allow external callers to run a specific workflow without a full user JWT:
| Endpoint | Description |
|---|---|
GET /api/v1/workflows/{id}/api-keys | List API keys for a workflow. |
POST /api/v1/workflows/{id}/api-keys | Create a new key (a random 32-byte hex string). |
DELETE /api/v1/workflows/{id}/api-keys/{keyId} | Revoke a key. |
Call the workflow:
curl -X POST https://your-instance/run/$WORKFLOW_ID \
-H "Authorization: Bearer $WORKFLOW_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"input_field": "value"}'
POST /run/{workflowId} is public but requires a valid Bearer key scoped to that workflow — distinct from the /webhooks/{workflowId} trigger route, and from the dashboard's authenticated /api/v1/workflows/{id}/trigger.
Chat deployments
Turn a workflow into a conversational chat widget — useful for support bots, internal Q&A, or any agent-backed assistant:
POST /api/v1/workflows/{id}/chat
{
"title": "Support Bot",
"greeting": "Hello! How can I help you today?",
"input_field": "message",
"output_field": "text",
"enabled": true
}
| Field | Default | Description |
|---|---|---|
title | "<workflow name> Chat" | Widget title. |
greeting | "Hello! How can I help you today?" | First message shown to the user. |
input_field | "message" | Trigger payload field the widget writes the user's message into. |
output_field | "text" | Workflow output field the widget displays as the assistant's reply. |
This generates a stable slug (chat-<first 8 chars of workflow id>) for embedding the widget. Pair this with an agent node using memory_mode: "session" (keyed by a per-visitor session ID) for a stateful conversation — see AI Agents & Tools.
GET / DELETE /api/v1/workflows/{id}/chat retrieve or remove the deployment.
Batch evaluation
Run a workflow once per row of a dataset — useful for evals, bulk data processing, or testing prompt changes across many examples:
POST /api/v1/workflows/{id}/batch
{
"name": "Eval run 2026-06-11",
"items": [
{ "input": "first test case" },
{ "input": "second test case" }
]
}
Each item in items becomes one execution, with the item's fields available as trigger data. Track progress and results:
| Endpoint | Description |
|---|---|
GET /api/v1/workflows/{id}/batches | List batch runs for a workflow. |
GET /api/v1/batches/{batchId} | Status and per-item results for a batch run. |
Combine with the Test Runner node (type: "test-runner") to assert on each item's output (e.g. not_empty, equals, regex, json_valid, status_ok) — failed assertions fail that item's execution, giving you a pass/fail rate across the batch.
For a reusable, versioned setup — a saved dataset, a library of graders including an LLM judge, and pass-rate tracking across runs — see Evaluations & Testing instead of a one-off batch.
Prompt Playground
POST /api/v1/playground/run runs a single LLM prompt (provider, model, system, prompt, temperature, max_tokens, api_key/base_url) without creating a workflow — for quickly iterating on prompts before wiring them into an llm or agent node.