Workflows
A workflow is the reusable phase graph a project expands from: phases (tasks), each phase's steps (agent / action / gate subtasks), their dependency edges, per-step tool/skill bindings, and per-step output schemas.
Workflows are database-backed and versioned. Versions are immutable — projects pin (workflow_slug, workflow_version) at expansion and keep that pin forever — so "editing" a spec always mints a new version. Ten built-in workflows ship seeded (content, micro-saas, blog-post, sticker-pack, landing-page, content-slideshow, childrens-book, motion-graphics, worksheet, digital-planner), and you can register your own through the same CRUD surface.
For the concept-level walkthrough (portal authoring sheet included) see Workflows.
The workflow objects
List entry (one per slug — the latest active version):
{
"slug": "content",
"version": 2,
"name": "Content pipeline",
"description": "Idea → research → storyboard → scenes → publish.",
"collection": "Content",
"tags": ["video", "long-form"],
"phase_count": 8,
"is_builtin": true,
"status": "active",
"updated_at": "2026-07-10T08:12:44Z"
}
Detail adds the full spec (the validated phase graph) plus created_at.
Endpoints
List workflows
GET /v1/workflows
One entry per slug, latest active version. Query params: collection, tag, include_archived (default false). This is what the project-create form's picker draws from.
Retrieve a workflow
GET /v1/workflows/{slug}?version=N
Detail including the full phase-graph spec. Latest active version by default; ?version=N fetches a specific — possibly archived — version, so existing project pins stay resolvable. 404 for an unknown slug.
List versions
GET /v1/workflows/{slug}/versions
Every version for a slug (any status), newest first, with version, status, is_builtin, timestamps, and description.
Create a workflow
POST /v1/workflows
Body:
{
"spec": { "slug": "podcast", "version": 1, "title": "Podcast pipeline", "phases": [ … ] },
"collection": "Content",
"tags": ["audio"]
}
The spec is fully validated before any write — structural validators plus step bindings (every agent step needs at least one resolvable tool or skill). owner_id is forced from your verified session; the body cannot set it. Returns 201 with the detail shape.
409 when (slug, version) already exists — versions are immutable; use PATCH with a spec to mint the next one. 400 on an invalid spec or unresolvable bindings.
Update a workflow
PATCH /v1/workflows/{slug}
Two behaviours depending on the body:
- Metadata only (
collection,tags,description) — updates the latest active version in place. 400 when the body has nothing to update. - Body includes
spec— mints a new immutable version (max existing + 1). Older versions, and every project pinned to them, are untouched. The new spec runs the same validation as create.
Archive a workflow
DELETE /v1/workflows/{slug}
Archives all versions of the slug (soft delete — status: "archived"). Archived workflows disappear from the default list and are rejected for new projects (400 at POST /v1/projects), but stay resolvable via ?version=N so existing pins keep working. 404 for an unknown slug.
SDK coverage
The SDKs currently expose templates.list only (catentio.templates.list() in Node/Python, client.Templates.List in Go) — still named for the old resource, and still working: it calls the deprecated /v1/templates alias, which returns exactly what /v1/workflows does. Detail, versions, create, update, and archive are available via the REST API shown above.
Errors
| Status | When |
|---|---|
| 400 | Invalid spec (structural validation), unresolvable step bindings, metadata PATCH with nothing to update. |
| 404 | Unknown slug, unknown version, no active version for a metadata PATCH. |
| 409 | POST for a (slug, version) that already exists. |
Next
- Workflows (concepts + portal) — the authoring workflow.
- Step bindings — the per-step tool/skill contract.
- Projects — expanding a workflow into a running pipeline.