List workflows
This page needs your own installation with an Embed license.
GET/
Lists an account’s workflows, newest first. Never their steps.
Needs a partner key: Authorization: Bearer gre_…, from Platform › Partner keys. Call it from your server only.
Parameters
Path
accountIdRequired · stringYour ID for the customer’s account: 1 to 255 bytes of UTF-8, case-sensitive. URL-encode it: it may contain
/.
Query
workspaceIdOptional · stringOnly this workspace, by your ID. Left out: every workspace.
statusOptional · stringdraft,liveorpaused.cursorOptional · stringThe
pagination.nextCursorof the page before. Left out: the first page.limitOptional · integerRows a page, 1 to 100. The default is 50.
Status
draft: never published. live: its trigger is on. paused: published, trigger off. templateId names the template it was installed from.
The webhook address
webhookUrl is where a webhook workflow takes deliveries, once its first publish or save has made the address. To start one you installed, enable it and read this field. Only these two reads carry it, never the answer of an install, enable or disable.
It works while the workflow is live and answers 404 otherwise. It starts production runs with no other credential, so hold it as you hold your key. It stays the same across enable and disable.
Responses
- 200OK
A page of workflows.
A parameter isn’t valid.
- 404
NOT_FOUNDNo such account or workspace.
Something failed on the installation’s side. Try again.
Any call can also answer: 401 UNAUTHORIZED · 403 EMBED_NOT_LICENSED · 403 IP_NOT_ALLOWED · 429 RATE_LIMITED · 503 BUSY. See Errors.
Request
GORUNNER="https://automations.example.com"
GORUNNER_EMBED_KEY="YOUR_PARTNER_KEY" # gre_…
ACCOUNT_ID="acct-bakery"
URL="$GORUNNER/api/embed/v1/accounts/$ACCOUNT_ID/"
URL="${URL}workflows"
curl "$URL" \
-H "Authorization: Bearer $GORUNNER_EMBED_KEY"const GORUNNER = "https://automations.example.com";
const KEY = process.env.GORUNNER_EMBED_KEY; // gre_…
const ACCOUNT_ID = encodeURIComponent("acct-bakery");
const res = await fetch(
`${GORUNNER}/api/embed/v1/accounts/` +
`${ACCOUNT_ID}/workflows`,
{
headers: { Authorization: `Bearer ${KEY}` },
},
);
const { data } = await res.json();import os, requests
from urllib.parse import quote
GORUNNER = "https://automations.example.com"
KEY = os.environ["GORUNNER_EMBED_KEY"] # gre_…
ACCOUNT_ID = quote("acct-bakery", safe="")
res = requests.get(
f"{GORUNNER}/api/embed/v1/accounts/"
f"{ACCOUNT_ID}/workflows",
headers={"Authorization": f"Bearer {KEY}"},
)
data = res.json()["data"]Response · 200 OK
{
"data": [
{
"id": "3b1e5c2a-7d4f-4e8b-a1c6-5f2d9b0e7a31",
"name": "New orders to Sheets",
"description": "Adds each new order as a row.",
"status": "live",
"triggerType": "webhook",
"workspace": {
"id": null,
"default": true
},
"templateId": "9c4e2a17-3d5b-4f86-b0e2-8a1c7d3f5e29",
"createdAt": "2026-10-20T08:00:00Z",
"updatedAt": "2026-10-25T09:00:00Z",
"webhookUrl": "https://automations.example.com/api/webhooks/2f4c8e1a-6b3d-4f7e-9a05-c1d2e3f4a5b6"
}
],
"pagination": {
"limit": 50,
"nextCursor": null
}
}Every field
It takes no body.
Response · 200 OK
dataarray of objectsidUUIDnamestringdescriptionstringstatusstringdraft: never published;live: its trigger is on;paused: published, trigger off.One of
draft,live,paused.triggerTypestringworkspaceobjectidstring or nullThe partner’s workspace id; null for the default workspace.
defaultbooleantemplateIdUUID or nullThe template it was installed from.
webhookUrlURLWhere this workflow takes deliveries (
POST /api/webhooks/{token}): on a webhook-triggered workflow, once its first publish or save has made the address, and only in the two reads,GET .../workflowsandGET .../workflows/{workflowId}(Cache-Control: no-store), never in a write’s answer, which anIdempotency-Keycan keep for a day. It takes deliveries while the workflow isliveand answers 404 otherwise. It starts production runs with no other credential: hold it as you hold this key. It stays the same across enable and disable, and changes only when a token rotates it (POST /api/workflows/{id}/webhook/rotate). Absent otherwise.createdAttimeupdatedAttimepaginationobjectlimitintegernextCursorstring or nullThe
cursorof the next page; null on the last page. A page that comes back full can carry a cursor even when nothing follows: the next page is then empty, with null here. Keep going until it is null.