List automations
Lists automations the caller can see. Results are filtered by the caller's accessible organizations; many routes paginate via page and limit.
Scope: automations:read
Endpoint: GET /api/automations
Example request
curl "https://guliel.com/api/automations?organizationId=value" \
-H "Authorization: Bearer $GULIEL_API_KEY"Query parameters
organizationIdreqstringstatusenum<4>DRAFT · ENABLED · PAUSED · PAUSED_NO_ACCESSpagereqintegerlimitreqinteger
Response (200/201)
automationsreqarray<object>idreqstringorganizationIdreqstringownerUserIdreqstringThe run-as identity: when the automation fires, actions execute under this user's current org permissions.namereqstringdescriptionreqstring | nullstatusreqenum<4>DRAFT = never armed; ENABLED = armed (fires on its trigger; the free tier allows 5 enabled per org); PAUSED = manually disarmed; PAUSED_NO_ACCESS = auto-paused because the owner lost the required org access.DRAFT · ENABLED · PAUSED · PAUSED_NO_ACCESScreatedAtreqstringupdatedAtreqstringblocksarray<object>idreqstringClient-chosen id, unique within the automation. Edges reference blocks by this id, and downstream blocks read this block's output via {{blocks.<id>.…}} bindings.kindreqenum<4>TRIGGER starts the flow when its event fires (every automation needs at least one); FILTER queries org data and outputs a shaped list/value; ACTION invokes a tool; CUSTOM is reserved and not executable in v1.TRIGGER · FILTER · ACTION · CUSTOMrefreqstring | nullWhat the block invokes. TRIGGER: an event type from the catalog, e.g. "invoice.paid" or "schedule.daily" (GET /api/automations/actions lists them). ACTION: an MCP tool name, e.g. "invoices.send", or engine-native "webhook.post" / "email.send". FILTER: omit — the query lives in config.spec.configreqobjectKind-specific configuration. ACTION: { input: { … } } — the arguments for the tool named by ref, matching that tool's inputSchema from the catalog; values may embed {{…}} bindings ({{trigger.*}}, {{blocks.<id>.*}}, {{item.*}} under a FOR_EACH edge, {{context.now}}, {{context.today}}, {{context.orgId}}) — a whole-string binding like "{{trigger.total}}" keeps the value's native type, inline bindings interpolate into the string. FILTER: { spec: { root, follows?, predicates?, aggregateBy?, extract, shape? } } over the served filter catalog. TRIGGER: ignored.positionreqobjectEditor canvas hint ({ x, y }). Ignored by the engine.
edgesarray<object>idreqstringClient-chosen id, unique within the automation.fromBlockIdreqstringId of the source block. The graph must be a DAG — self-loops and cycles are rejected.toBlockIdreqstringId of the target block. The target runs only after the source step succeeds and the cond (if any) passes.condreqobject | nullOptional guard — null/omitted means the edge is always followed. Leaf: { left, op, right? } with op one of eq | ne | gt | gte | lt | lte | in | nin | contains | exists | empty; compose with { all: […] }, { any: […] }, { not: … }. Operands may be literals or {{…}} bindings; comparisons are type-light (100 equals "100").modereqenum<2>ONCE (default) passes the source output downstream as-is; FOR_EACH fans a list-valued source output out, running the target once per element (exposed as {{item.*}}) — a non-list source falls back to a single run.ONCE · FOR_EACHorderreqintegerDisplay ordering only — execution order is topological.
paginationreqobjectpagereqintegerlimitreqintegertotalreqintegertotalPagesreqinteger
Error responses
400 | Validation |
401 | Unauthenticated |
403 | Forbidden |
500 | Internal |