POST /v1/workflows/analyze-funds
Analyze the fund requirements of an inline workflow definition without saving or executing it. Same response shape as the workflow-scoped variant, with `workflowId` empty. Read-only — does not consume CU.
POST
/v1/workflows/analyze-funds
Analyze the fund requirements of an inline workflow definition without saving or executing it. Same response shape as the workflow-scoped variant, with `workflowId` empty. Read-only — does not consume CU.
Request Body required
Inline workflow definition
application/jsonOne of:
Option 1
Option 2
defaultWalletAddress
string
DefaultWalletAddress overrides the wallet used when a node has no
explicit connector or payload wallet field. When empty, the org's
default wallet is used (same fallback as the saved-workflow path).
definition
object
REQUIRED
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, objectResponses
200
OK
application/jsoncode
integer
data
object
balancesFetched
boolean
requirements
object[]
Array of:
amountIsHumanReadable
boolean
balance
object
amount
string
raw units (wei)
amountUsd
number
chainId
integer
decimals
integer
isInsufficient
boolean
amount < requiredAmount
isLow
boolean
gas only: balance below LowGasThreshold
symbol
string
tokenAddress
string
walletAddress
string
chainId
integer
chainName
string
decimals
integer
isNative
boolean
nodeId
string
nodeName
string
nodeType
string
reason
string
requiredAmount
string
source
string
Enum:
requiredTokens, fundsMovement.sent, requiresGassymbol
string
tokenAddress
string
unresolved
boolean
unresolvedReason
string
Enum:
chainId, tokenAddress, parseError, templatewalletAddress
string
unresolved
object[]
Array of:
amountIsHumanReadable
boolean
chainId
integer
chainName
string
decimals
integer
isNative
boolean
nodeId
string
nodeName
string
nodeType
string
reason
string
requiredAmount
string
source
string
Enum:
requiredTokens, fundsMovement.sent, requiresGassymbol
string
tokenAddress
string
unresolved
boolean
unresolvedReason
string
Enum:
chainId, tokenAddress, parseError, templatewalletAddress
string
workflowId
string
workflowVersion
integer
message
string
requestId
string
400
Invalid definition
403
Missing org context
curl -X POST 'https://api.example.com/v1/workflows/analyze-funds' \ -H 'Authorization: Bearer YOUR_API_TOKEN' \ -H 'Content-Type: application/json' \ -d '{}'
const response = await fetch('https://api.example.com/v1/workflows/analyze-funds', { method: 'POST', headers: { "Authorization": "Bearer YOUR_API_TOKEN", "Content-Type": "application/json" }, body: JSON.stringify({})});const data = await response.json();console.log(data);
import requestsheaders = { 'Authorization': 'Bearer YOUR_API_TOKEN'}response = requests.post('https://api.example.com/v1/workflows/analyze-funds', headers=headers, json={})print(response.json())
package mainimport ( "fmt" "io" "net/http" "strings")func main() { body := strings.NewReader(`{}`) req, _ := http.NewRequest("POST", "https://api.example.com/v1/workflows/analyze-funds", body) req.Header.Set("Authorization", "Bearer YOUR_API_TOKEN") req.Header.Set("Content-Type", "application/json") resp, _ := http.DefaultClient.Do(req) defer resp.Body.Close() result, _ := io.ReadAll(resp.Body) fmt.Println(string(result))}
200
Response
{ "code": 200, "data": { "balancesFetched": true, "requirements": [ { "amountIsHumanReadable": true, "balance": { "amount": "<string>", "amountUsd": 123, "chainId": 123, "decimals": 123, "isInsufficient": true, "isLow": true, "symbol": "<string>", "tokenAddress": "<string>", "walletAddress": "<string>" }, "chainId": 123, "chainName": "<string>", "decimals": 123, "isNative": true, "nodeId": "<string>", "nodeName": "<string>", "nodeType": "<string>", "reason": "<string>", "requiredAmount": "<string>", "source": "requiredTokens", "symbol": "<string>", "tokenAddress": "<string>", "unresolved": true, "unresolvedReason": "chainId", "walletAddress": "<string>" } ], "unresolved": [ { "amountIsHumanReadable": true, "chainId": 123, "chainName": "<string>", "decimals": 123, "isNative": true, "nodeId": "<string>", "nodeName": "<string>", "nodeType": "<string>", "reason": "<string>", "requiredAmount": "<string>", "source": "requiredTokens", "symbol": "<string>", "tokenAddress": "<string>", "unresolved": true, "unresolvedReason": "chainId", "walletAddress": "<string>" } ], "workflowId": "<string>", "workflowVersion": 123 }, "message": "success", "requestId": "abc-123"}
API Playground
Try this endpoint
POST
/v1/workflows/analyze-funds
