GET /v1/templates/{templateId}/versions/{versionNumber}
Get a specific version of a template by version number
GET
/v1/templates/{templateId}/versions/{versionNumber}
Get a specific version of a template by version number
Path Parameters
templateId
string
required
path
Template ID
versionNumber
integer
required
path
Version number
Responses
200
OK
application/jsoncode
integer
data
object
archived
boolean
category
string
Deprecated: Use Tags instead
cooldownMs
integer
createdAt
string
createdBy
string
definition
object
Definition is the inline workflow graph to analyze. Same shape as a
saved workflow's definition. Unlike the ephemeral-run endpoint there
is no trigger restriction — analysis is read-only and method-agnostic.
blockExpansions
object
Set on run snapshots only (not workflow DB)
inputSchema
object[]
Array of:
description
string
key
string
required
boolean
type
string
"string", "number", "boolean", "object", "array"
nodes
object
REQUIRED
triggerNodeIds
string[]
TriggerNodeIDs lists the node IDs that are trigger (root) nodes. Every
workflow declares this — single-trigger workflows ship ["root"] (the
legacy node id), multi-trigger workflows list every trigger node id.
Treating single-trigger as a forest-of-1 removes the two-path branching
throughout the BE + FE; older rows without the field are backfilled by
migration 000282 and the field-missing path stays as a read-side safety
net (see FindTriggerNodeIDs) but is no longer exercised by saves.
"root" is also a runtime alias for "the trigger that fired this run" —
{{root.X}} variable references resolve to the firing trigger regardless
of which trigger fired. Don't repurpose the literal "root" as a trigger
id on a multi-trigger workflow.
Array of:
variableDefs
object[]
VariableDefs is a snapshot of the workflow's declared variables at run
creation time. The canonical source lives on the workflows row
(Workflow.VariableDefs column). Snapshotted into the run definition
so the worker can resolve {{$vars.x}} lookups and route variable-action
writes to the right scope without an extra DB round trip.
Array of:
default
unknown
description
string
lifetime
string
Enum:
persist, resetname
string
type
string
Enum:
number, text, boolean, list, objectdescription
string
forkCount
integer
generatedAppId
string
Generated-app attachment (nil when the template ships no app). On
adoption the referenced app is CLONED into the adopting org's new
workflow. GeneratedAppVersionID optionally pins a specific version
whose manifest is used as the clone source.
generatedAppVersionId
string
id
string
isPromoted
boolean
maxRuns
integer
moderationStatus
string
Moderation fields (B3-4168). Only meaningful for public templates;
org templates are always approved.
Enum:
pending, approved, rejectedname
string
organizationDescription
string
organizationId
string
Fields for user-generated templates (nil for built-in templates)
organizationName
string
organizationPhoto
string
promotedAt
string
promotedBy
string
promotedOrder
integer
rejectionReason
string
reviewedAt
string
reviewedBy
string
slug
string
sourceWorkflowId
string
Source workflow link (nil for built-in or legacy templates)
submittedAt
string
tableSchemas
object
tags
object[]
Array of:
categories
string[]
e.g., ["blockchain", "finance"]
Array of:
count
integer
Scope-dependent: template, action, trigger, or connector count
createdAt
string
description
string
id
string
imageUrl
string
name
string
promotedTemplateCount
integer
publicTemplateCount
integer
slug
string
updatedAt
string
weight
integer
Higher weight = more prominent
templateProps
object[]
Array of:
default
unknown
description
string
key
string
name
string
properties
object
accountType
string
AccountType filters the wallet picker by account type on
inputType="walletConnector" fields (e.g. "polymarket_deposit_wallet").
allowWalletPicker
boolean
allowedChannels
string[]
Array of:
autoFillFromWallet
boolean
AutoFillFromWallet, when true, auto-fills this prop with the selected
workflow wallet address and hides it from the form. Pointer so an
explicit false survives the JSON round-trip (same rationale as
AllowWalletPicker).
bindsConnectorNodes
string[]
BindsConnectorNodes lists workflow node IDs whose wallet-type connector
should be prefilled from this prop's picked wallet (inputType:
"walletConnector"). The connector stays a plain, editable connector —
this is a prefill, not a permanent bind.
Array of:
chainId
integer
For tokenAmount: hardcoded chain ID
chainPropKey
string
For tokenSelector/tokenAmount: prop key providing chainId
columns
object[]
Columns describes a csvTable prop (inputType: "csvTable"). The stored
value is an object-of-columnar-arrays: {colKey: []value}. Payload
templates reference each column via {{$props.<propKey>.<colKey>}}.
Array of:
chainId
integer
chainPropKey
string
For tokenAmount cells
inputType
string
key
string
name
string
pattern
string
placeholder
string
required
boolean
tokenAddress
string
tokenAddressPropKey
string
For tokenAmount cells
type
string
"string", "number", "integer"
dex
string
For hyperliquidAsset: hardcoded DEX name (fallback when no dexPropKey)
dexPropKey
string
For hyperliquidAsset: prop key providing HIP-3 DEX name
enum
unknown[]
Array of:
enumLabels
string[]
Array of:
excludeNative
boolean
For tokenSelector/multiTokenSelector: hide native tokens (field only accepts ERC-20 contract addresses)
groupKey
string
Groups related props for unified UI rendering
inputType
string
maxRows
integer
csvTable: maximum allowed rows (0 = no cap)
maximum
number
minRows
integer
csvTable: minimum required rows (0 = default 1)
minimum
number
pattern
string
placeholder
string
showWalletBalances
boolean
For tokenSelector: show wallet balances (useful for "sell" tokens)
sources
object[]
Array of:
fieldPath
string
nodeId
string
nodeLabel
string
summary
object
Summary drives the csvTable footer summary. Nil means no summary is
rendered. See PropSchemaSummary for details.
aggregates
object[]
Aggregates declared in display order, left-to-right.
Array of:
...
position
string
Position in the grid. "footer" (default) renders inline under the
table. "none" suppresses even when aggregates are declared — use to
disable inherited summaries. Other values reserved.
tokenAddress
string
For tokenAmount: hardcoded token address
tokenAddressPropKey
string
For tokenAmount: prop key providing tokenAddress
visibleWhen
object
VisibleWhen controls conditional visibility: show this prop only when
the referenced prop has the specified value.
propKey
string
value
unknown
required
boolean
sensitive
boolean
type
string
"string", "number", "integer", "boolean", "object" (for csvTable)
uiMetadata
object
comments
object[]
Array of:
createdAt
string
createdBy
object
clientId
string
name
string
id
string
nodeId
string
position
object
x
number
y
number
replies
object[]
Array of:
createdAt
string
createdBy
object
...
id
string
text
string
updatedAt
string
resolved
boolean
text
string
updatedAt
string
nodePositions
object
stickyNotes
object[]
Array of:
color
string
createdAt
string
createdBy
object
clientId
string
name
string
id
string
position
object
x
number
y
number
size
object
height
number
width
number
text
string
updatedAt
string
zIndex
integer
updatedAt
string
updatedBy
string
version
integer
visibility
string
Enum:
org, public, org, publicmessage
string
requestId
string
400
Bad Request
404
Not Found
curl -X GET 'https://api.example.com/v1/templates/string/versions/0' \ -H 'Authorization: Bearer YOUR_API_TOKEN'
const response = await fetch('https://api.example.com/v1/templates/string/versions/0', { method: 'GET', headers: { "Authorization": "Bearer YOUR_API_TOKEN" }});const data = await response.json();console.log(data);
import requestsheaders = { 'Authorization': 'Bearer YOUR_API_TOKEN'}response = requests.get('https://api.example.com/v1/templates/string/versions/0', headers=headers)print(response.json())
package mainimport ( "fmt" "io" "net/http")func main() { req, _ := http.NewRequest("GET", "https://api.example.com/v1/templates/string/versions/0", nil) req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN") resp, _ := http.DefaultClient.Do(req) defer resp.Body.Close() result, _ := io.ReadAll(resp.Body) fmt.Println(string(result))}
200
Response
{ "code": 200, "data": { "archived": true, "category": "<string>", "cooldownMs": 123, "createdAt": "<string>", "createdBy": "<string>", "definition": { "blockExpansions": "<object>", "inputSchema": [ { "description": "<string>", "key": "<string>", "required": true, "type": "<string>" } ], "nodes": "<object>", "triggerNodeIds": [ "<string>" ], "variableDefs": [ { "default": "<unknown>", "description": "<string>", "lifetime": "persist", "name": "<string>", "type": "number" } ] }, "description": "<string>", "forkCount": 123, "generatedAppId": "<string>", "generatedAppVersionId": "<string>", "id": "<string>", "isPromoted": true, "maxRuns": 123, "moderationStatus": "pending", "name": "<string>", "organizationDescription": "<string>", "organizationId": "<string>", "organizationName": "<string>", "organizationPhoto": "<string>", "promotedAt": "<string>", "promotedBy": "<string>", "promotedOrder": 123, "rejectionReason": "<string>", "reviewedAt": "<string>", "reviewedBy": "<string>", "slug": "<string>", "sourceWorkflowId": "<string>", "submittedAt": "<string>", "tableSchemas": "<object>", "tags": [ { "categories": [ "<string>" ], "count": 123, "createdAt": "<string>", "description": "<string>", "id": "<string>", "imageUrl": "<string>", "name": "<string>", "promotedTemplateCount": 123, "publicTemplateCount": 123, "slug": "<string>", "updatedAt": "<string>", "weight": 123 } ], "templateProps": [ { "default": "<unknown>", "description": "<string>", "key": "<string>", "name": "<string>", "properties": { "accountType": "<string>", "allowWalletPicker": true, "allowedChannels": [ {} ], "autoFillFromWallet": true, "bindsConnectorNodes": [ {} ], "chainId": 123, "chainPropKey": "<string>", "columns": [ {} ], "dex": "<string>", "dexPropKey": "<string>", "enum": [ {} ], "enumLabels": [ {} ], "excludeNative": true, "groupKey": "<string>", "inputType": "<string>", "maxRows": 123, "maximum": 123, "minRows": 123, "minimum": 123, "pattern": "<string>", "placeholder": "<string>", "showWalletBalances": true, "sources": [ {} ], "summary": { "aggregates": {}, "position": {} }, "tokenAddress": "<string>", "tokenAddressPropKey": "<string>", "visibleWhen": { "propKey": {}, "value": {} } }, "required": true, "sensitive": true, "type": "<string>" } ], "uiMetadata": { "comments": [ { "createdAt": "<string>", "createdBy": { "clientId": {}, "name": {} }, "id": "<string>", "nodeId": "<string>", "position": { "x": {}, "y": {} }, "replies": [ {} ], "resolved": true, "text": "<string>", "updatedAt": "<string>" } ], "nodePositions": "<object>", "stickyNotes": [ { "color": "<string>", "createdAt": "<string>", "createdBy": { "clientId": {}, "name": {} }, "id": "<string>", "position": { "x": {}, "y": {} }, "size": { "height": {}, "width": {} }, "text": "<string>", "updatedAt": "<string>", "zIndex": 123 } ] }, "updatedAt": "<string>", "updatedBy": "<string>", "version": 123, "visibility": "org" }, "message": "success", "requestId": "abc-123"}
API Playground
Try this endpoint
GET
/v1/templates/{templateId}/versions/{versionNumber}
