GoRunner docs
Search or askSearch⌘K

Save a workflow as a template

POST/api/templates

Saves a copy of a workflow’s draft as a template.

Needs an API token with the Write permission for workflows (workflow:write).

Parameters

Body

workflowIdRequired · UUID

The workflow to copy, in this workspace. Its draft is copied as it is now.

nameOptional · string

Up to 255 characters, trimmed. Blank: the workflow’s name.

descriptionOptional · string

Trimmed. Blank stays blank: the template then describes itself by its trigger and first steps.

categoryOptional · string

Any label, trimmed.

What is copied

The steps and their settings, plain variables and notes. Not sensitive variables, which a template can’t hold, and not a secret typed into a step: those are listed in blanked. Preview saving says which first.

Connections travel by ID and are matched when the template is used. The copy never changes when the workflow does; update its steps to copy again.

In an organization it belongs to the organization; in a customer account, to this workspace. It takes no Idempotency-Key: a retry saves a second one.

Responses

  • 201Created

    The template, with its copy of the steps and blanked: each value the copy left out.

  • The body isn’t JSON, workflowId is missing or not a UUID, or the name is over 255 characters.

  • The token lacks the Write permission for workflows.

  • No workflow with this ID in the workspace.

  • The template wasn’t saved. Try again.

Any call can also answer: 401 UNAUTHORIZED · 401 TOKEN_ENDED · 403 TOKEN_SURFACE_OFF · 403 FEATURE_OFF · 403 EMBED_NOT_ALLOWED · 403 EMBED_NOT_AVAILABLE · 403 ACCOUNT_SUSPENDED · 413 PAYLOAD_TOO_LARGE · 415 INVALID_CONTENT_TYPE · 429 RATE_LIMITED · 503 BUSY · 503 PAUSED · 503 SERVICE_UNAVAILABLE. See Errors.

Request

GORUNNER="https://api.gorunner.io"
GORUNNER_TOKEN="grt_…"  # needs Write for workflows

curl -X POST "$GORUNNER/api/templates" \
  -H "Authorization: Bearer $GORUNNER_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "workflowId": "3b1e5c2a-7d4f-4e8b-a1c6-5f2d9b0e7a31",
    "name": "Order intake",
    "category": "Sales"
  }'

Response · 201 Created, shortened

json
{
  "data": {
    "id": "9c4e2a17-3d5b-4f86-b0e2-8a1c7d3f5e29",
    "scope": "org",
    "name": "Order intake",
    "description": "Webhook to fulfilment, with a VIP branch.",
    "category": "Sales",
    "triggerType": "webhook",
    "createdAt": "2026-10-20T08:00:00Z",
    "definition": {
      "schemaVersion": 2,
      "trigger": {
        "name": "trigger",
        "displayName": "Order received",
        "type": "webhook",
        "pieceId": "webhook",
        "pieceVersion": "1.0.0",
        "actionId": "catch_webhook",
        "config": {
          "methods": [
            "POST"
          ]
        },
        "valid": true,
        "nextAction": {
          "name": "forward",
          "displayName": "Forward to fulfilment",
          "type": "PIECE",
          "pieceId": "http",
          "pieceVersion": "1.0.0",
          "actionId": "send_request",
          "config": {
            "method": "POST",
            "url": "https://example.com/fulfilment",
            "body_type": "json",
            "body_json": "{{trigger.body}}"
          },
          "valid": true
        }
      },
      "settings": {}
    },
    "blanked": [
      {
        "step": "forward",
        "stepLabel": "Forward to fulfilment",
        "field": "auth_token",
        "fieldLabel": "Bearer Token"
      }
    ]
  }
}
Every field

Body

workflowIdRequired · UUID

The workflow whose CURRENT DRAFT definition is snapshotted. Must be in the caller’s workspace. You never submit a definition yourself.

nameOptional · string

Optional; trimmed. Blank falls back to the source workflow’s name. Max 255 characters.

descriptionOptional · string

Optional; trimmed. Blank stays blank (the template then shows a generated whenLine).

categoryOptional · string

Optional free-text grouping label; trimmed. No server-side vocabulary.

Response · 201 Created

dataobject

A template with its definition: an immutable snapshot of a workflow’s draft taken when it was saved (or its steps last updated). A copy, never a live link: workflows made from it are not affected by changing or deleting it.

idUUID
scopestring

Who sees it: org — an organization’s, every workspace of it; workspace — a customer account’s, the workspace it was saved in only; installation — shared by the installation with its customer accounts (listed only in a customer account, and only while the license has embedding), read-only here.

One of org, workspace, installation.

keystring

An installation template’s stable handle. Absent on every other template.

namestring
descriptionstring

What it does, as saved. May be empty: whenLine then describes it.

categorystring

Free-text grouping label; empty when none.

triggerTypestring
createdAttime
updatedAttime
publishedAttime

When an installation template was first offered. Absent on every other template.

readableboolean

false: its definition cannot be read. Such a row is listed only to someone who may delete it (canManage), with everything derived from the definition empty.

authorobject or null

Who saved it; null for an installation template.

idUUID or null
namestring or null

Their name, else their email; null once the account is deleted.

leftboolean

They are no longer a member of this organization.

sourceobject or null

An installation template’s origin; null otherwise.

organizationstring

The organization it was shared from; empty once that organization is gone.

savedHereboolean

It was saved in this workspace. Otherwise its bound values arrive blank (see TemplateFillField).

savedInstring or null

The workspace it was saved in (an installation template: the organization it was shared from); null when not recorded.

sourceWorkflowobject or null

The workflow it was saved (or last updated) from, while that workflow exists and is in this workspace.

idUUID
namestring
triggerobject or null
namestring
displayNamestring
pieceIdstring
actionIdstring
marksarray of strings

App ids in run order: the trigger’s, then one per step (branch steps branch, loops loop, a Code step code), never de-duplicated.

stepsarray of objects

Every step, in the order of marks after the trigger.

namestring
displayNamestring
pieceIdstring
actionIdstring
typestring

One of PIECE, CODE, BRANCH, LOOP.

depthinteger

0 at the top level; one more inside a branch arm, a loop body or an error path.

whenLinestring

A generated line for a template without a description: how it starts, then its first three steps’ names.

slotsarray of objects

The connections a workflow made from it needs, one per service account.

keystring
pieceIdstring

The connection’s app (what GET /api/connections rows carry).

pieceNamestring
stepsarray of strings
stepLabelsarray of strings
connectionIdstring or null

The connection the template’s own steps name; null for an installation template or none.

toFillinteger

How many values using it here will ask for: required fields left blank and bound values blanked here.

availableboolean
unavailableobject or null

Why it cannot be used on this installation.

codestring

One of PIECE_UNAVAILABLE, STEP_INCOMPLETE, ACTION_UNAVAILABLE, UNREADABLE.

messagestring
stepstring

The step it is about, by name.

usesobject or null

Workflows of this organization made from it, and how many are live. Sent only to its author, an organization admin or a platform admin.

workflowsinteger
liveinteger
canManageboolean

The caller may rename, update the steps of and delete it: its creator, an organization admin, or for a workspace template that workspace’s admin.

createdByUUID

Who saved it, as before the Templates redesign (author names them). Absent on an installation template and when the account is gone.

definitionobject

A workflow definition — the same document the workflow API uses (schemaVersion is 2). It is a TREE, not a list: trigger is the root and each node chains onward through nextAction; branches[].firstAction and firstLoopAction hold nested sub-chains, and onErrorAction holds a step’s error arm. A step’s settings live in config, never settings. The trigger names its trigger in a field called actionId, and trigger type is lowercase while action type is UPPERCASE (PIECE, BRANCH, LOOP, CODE). A step that uses credentials carries connectionId — a bare connection id, workspace-scoped, which is why it may be cleared when the template is used in another workspace.

A workflow definition: its fields are in Workflow definition.

blankedarray of objects

Only on a save’s and an update of the steps’ answers: each value the copy left out (a credential typed into a step).

stepstring

The step’s name (the trigger’s own name for the trigger).

stepLabelstring

The step as the canvas names it.

fieldstring

The top-level input key.

fieldLabelstring

The app’s title for the input.