Quickstart: your first workflow
This walks through creating an account, building a simple workflow, and running it — both from the visual canvas and via the API.
1. Register & sign in
Open the frontend (http://localhost:5173) and register. The first registration on a fresh database creates:
- A tenant (your workspace), identified by a
tenant_slug - A user with the
ownerrole on that tenant, on the Free plan
Or via the API:
curl -X POST http://localhost:3001/api/v1/auth/register \
-H 'Content-Type: application/json' \
-d '{
"tenant_slug": "acme",
"tenant_name": "Acme Inc",
"email": "you@acme.com",
"password": "supersecret123"
}'
This returns a JWT — pass it as Authorization: Bearer <token> on every subsequent API call.
2. Build a workflow on the canvas
- Click New Workflow from the dashboard.
- Drag a trigger node onto the canvas — for this example, choose Webhook.
- Add an HTTP node, connect it to the trigger, and configure it to call any API (e.g. a public JSON API).
- Add an LLM node, connect it after the HTTP node, and write a prompt that references the HTTP response, e.g.
Summarize this data: {{steps.http_1.output.body}}. - Add a Slack connector node (or Set node if you don't have Slack connected) to do something with the result.
- Click Save, then Enable the workflow.
See Workflows & the DSL for how the canvas maps to the underlying JSON definition, and Nodes for what every node type does.
3. The same workflow as DSL
Every workflow is a JSON document with a trigger and a list of steps (a DAG via depends_on). The canvas is just an editor for this document — you can also create workflows directly via the API or the AI Workflow Generator.
{
"id": "wf_quickstart",
"name": "Fetch and Summarize",
"description": "Fetch JSON from an API and summarize it with an LLM",
"version": 1,
"trigger": {
"type": "http",
"config": {}
},
"steps": [
{
"id": "fetch",
"name": "Fetch data",
"type": "http",
"config": {
"method": "GET",
"url": "https://api.example.com/data"
}
},
{
"id": "summarize",
"name": "Summarize with LLM",
"type": "llm",
"depends_on": ["fetch"],
"config": {
"provider": "anthropic",
"model": "claude-sonnet-4-6",
"prompt": "Summarize this JSON in 3 bullet points:\n\n{{steps.fetch.output.body}}"
}
}
]
}
Create it via the API:
curl -X POST http://localhost:3001/api/v1/workflows \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"name": "Fetch and Summarize",
"description": "Fetch JSON from an API and summarize it with an LLM",
"dsl": { "...": "the JSON above" }
}'
4. Run it
Manually, via the dashboard's Run button, or:
curl -X POST http://localhost:3001/api/v1/workflows/$WORKFLOW_ID/trigger \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{}'
Via webhook (if the trigger type is http), enable the workflow and POST to:
curl -X POST http://localhost:3001/webhooks/$WORKFLOW_ID \
-H 'Content-Type: application/json' \
-d '{"hello": "world"}'
Each run creates a Temporal workflow execution. Open the Executions tab (or the Temporal Web UI at http://localhost:8081) to watch it progress step by step, inspect each step's input/output, token usage, and cost.
5. Generate a workflow with AI instead
Skip steps 2-3 entirely — describe what you want in plain English:
curl -X POST http://localhost:3001/api/v1/workflows/generate \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"prompt": "Every morning at 9am, fetch the top 5 Hacker News stories and post a summary to Slack"}'
This returns a complete WorkflowDSL (trigger, steps, connectors, prompts) ready to save and enable. See AI Workflow Generator.
Next steps
- Core Concepts — understand workflows, nodes, triggers, and executions in depth.
- Connector Reference — connect Slack, Gmail, GitHub, databases, and 60+ other services.
- AI Agents & Tools — build agents that can use tools and remember context.