List variables
GET/
Lists a workflow’s variables. Sensitive ones come back by name only.
Needs an API token with the Read permission for workflows (workflow:read).
Parameters
Path
idRequired · UUIDThe workflow’s ID.
Two kinds
| What | Plain | Sensitive |
|---|---|---|
| Where it is kept | In the draft | Encrypted, outside the draft |
| Read back | With its value | Never: value is "" |
| Takes effect | When you publish | At once |
| In exports and templates | Yes | No |
| In a duplicate | Yes | Yes |
Steps read both as {{$vars.NAME}}. secretsAvailable is false when the server has no encryption key: sensitive variables can’t be saved there.
Responses
- 200OK
Every variable, sensitive ones first, then by name.
idisn’t a UUID.- 403
FORBIDDENThe token lacks the Read permission for workflows.
- 404
NOT_FOUNDNo workflow with this ID in the token’s workspace.
The sensitive variables couldn’t be read. 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 · 429 RATE_LIMITED · 503 BUSY · 503 PAUSED · 503 SERVICE_UNAVAILABLE. See Errors.
Request
GORUNNER="https://api.gorunner.io"
GORUNNER_TOKEN="grt_…" # needs Read for workflows
WORKFLOW_ID="your-workflow-id"
curl "$GORUNNER/api/workflows/$WORKFLOW_ID/variables" \
-H "Authorization: Bearer $GORUNNER_TOKEN"const GORUNNER = "https://api.gorunner.io";
const TOKEN = process.env.GORUNNER_TOKEN;
const WORKFLOW_ID = process.env.WORKFLOW_ID;
const res = await fetch(
`${GORUNNER}/api/workflows/${WORKFLOW_ID}/` +
`variables`,
{
headers: { Authorization: `Bearer ${TOKEN}` },
},
);
const { data } = await res.json();import os, requests
GORUNNER = "https://api.gorunner.io"
TOKEN = os.environ["GORUNNER_TOKEN"]
WORKFLOW_ID = os.environ["WORKFLOW_ID"]
res = requests.get(
f"{GORUNNER}/api/workflows/{WORKFLOW_ID}/"
f"variables",
headers={"Authorization": f"Bearer {TOKEN}"},
)
data = res.json()["data"]Response · 200 OK
{
"data": {
"variables": [
{
"name": "STRIPE_KEY",
"value": "",
"isSecret": true
},
{
"name": "SLACK_CHANNEL",
"value": "#alerts",
"isSecret": false
}
],
"secretsAvailable": true,
"definitionRev": 7,
"hasUnpublishedChanges": false
}
}Every field
It takes no body.
Response · 200 OK
dataobjectvariablesarray of objectsSensitive variables first, then by name.
namestringvaluestringThe value for a PLAIN variable. Always an empty string for a sensitive one — there is no read path for a secret.
isSecretbooleanTrue = stored encrypted outside the definition and takes effect immediately, without a publish. False = lives in the draft definition and reaches production only when you publish.
secretsAvailablebooleanFalse when the server has no encryption key configured — writing any
isSecretvariable will then be refused with 422.definitionRevintegerThe workflow’s revision as this answer leaves it. Plain variables live in the draft definition, so a
PUTmoves it: send this asexpectedRevon your next write to the workflow (PUT /api/workflows/{id}or this endpoint).hasUnpublishedChangesbooleanWhether the draft is now ahead of the published version — a variable change on a live workflow takes effect only when published.