Serenities AI™
Back to API Overview

Flows API

Create, update, and execute automation flows. Manage flow configurations and view execution history.

35 endpoints

Endpoints

POST
/api/v1/flow/create

Create a new flow. Params: name (required), description. Returns empty flow ready for nodes.

Parameters

namestringrequired

Name for the new automation flow

descriptionstring

Optional description of the flow

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/create \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "example",
  "description": "example"
}'
POST
/api/v1/flow/list

List all automation flows. Returns array with id, name, description, isActive, triggerType, nodes[], edges[].

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/list \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{}'
POST
/api/v1/flow/getAvailableNodes

Get available node types for building flows. Params: type ("all"|"triggers"|"utilities"|"tools"|"connectors"|"agents"|"ai"), category, mcpServerId, connectorId, toolNames, search, limit (default 50), offset. Returns: triggers, utilities (with defaultConfig), ai config, tools (built-in apps, with inputSchema for each tool), connectors (the built-in Serenities tools first, then the user's own MCP connectors from Automations → Connectors, each with connectorId, slug and tools. Without toolNames / connectorId / category / search this is a COMPACT index — every tool's name, toolName, toolKind, group and one-line description, no inputSchema; pass toolNames: ["tables_createRow", …] to load exactly those tools with inputSchema, or narrow with connectorId / category / search for full detail, limit/offset paginated. Add one as a tool node with data.kind "connector" and data.connectorId, no connectionId; see nodeStructure.connectorStep), agents (the user's AI agents — add one as a tool node with data.kind "agent" and data.agentId, config {task, waitMode, timeoutMinutes}; see nodeStructure.agentStep), nodeStructure templates, utilityCategories.

Parameters

typestring

Filter by node type. "connectors" = the user's own MCP connectors (Automations → Connectors) and their tools, added as connector steps

categorystring

Filter utilities/tools by category. For connectors: a tool group — a platform tool's router such as "tables" or "flow", or a user connector's slug — and switches the connectors answer to full detail

mcpServerIdstring

Filter tools by specific MCP server

connectorIdstring

Connectors: only this connector (a connectorId from a previous call, or "platform:serenities" for the built-in Serenities tools); switches the connectors answer to full detail

toolNamesarray

Connectors: load exactly these tools WITH their inputSchema, by name or toolName (e.g. ["tables_createRow", "gmail_send_message"]). The cheap follow-up to the compact index

searchstring

Search by name or description. For connectors this switches to full detail (inputSchema) for the matches

limitinteger

Max items for tools, and for full-detail connector tools (default 50)

offsetinteger

Offset for tools / full-detail connector tools pagination

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getAvailableNodes \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "type": "example",
  "category": "example",
  "mcpServerId": "example"
}'
POST
/api/v1/flow/getById

Get flow details with nodes and edges. Param "id" is flow ID from list.

Parameters

idstringrequired

Flow ID from list

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getById \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/flow/update

Update flow. Params: id (flow ID), name, description, isActive, triggerType, nodes, edges. Nodes: [{id, type: "trigger"|"tool"|"utility"|"ai", position: {x, y}, data: {label, sequenceNumber, ...}}]: a step's settings go in data.config; a trigger node has data.triggerType ("manual"|"webhook"|"schedule"|"table"|"event") and its own settings directly on data. A table trigger's settings sit directly on the node's data, never in data.config: data.triggerType "table", data.tableId (the table's id, from tables_listTables) and data.tableEventType, one of: row_created, row_updated, row_deleted, field_changed, status_changed, form_submitted, date_arrives, date_approaching, date_passed. Optional, also on data: viewId, fieldIds (field_changed, status_changed and the date_* events: the column), statusValues (status_changed) and daysBeforeApproaching (date_approaching). A connector step is a "tool" node with data.kind "connector" and data.connectorId (from getAvailableNodes type "connectors"); the connector must belong to the user or the save is refused. Trigger nodes have data.triggerType. Edges: [{id, source, target, sourceHandle: "output", targetHandle: "input"}]. After adding trigger nodes, use createWebhook/createSchedule to set up the backend.

Parameters

idstringrequired

Flow ID from list

namestring

New name for the flow

descriptionstring

New description

nodesarray

Array of flow nodes (at most 1000)

edgesarray

Array of flow edges connecting nodes (at most 5000)

triggerTypestring

Trigger type: "manual", "webhook", "schedule", "table"

isActiveboolean

Whether the flow is active

usedSequenceNumbersarray

Used sequence numbers for node ordering

stopAfterMinutesnumber

"Stop a run after" in whole minutes, from 1 up to the plan's longest run (getById shows runTime.maxMinutes); null goes back to the plan default

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/update \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "name": "example",
  "description": "example"
}'
POST
/api/v1/flow/updateNodeConfig

Update a single node configuration in place (no need to resend the whole flow). Params: flowId, nodeId, config (object with node settings). REPLACES the node's existing config: read it with getById first and send the full merged object. The config shape of each node type comes from getAvailableNodes and getHelp; values support {{template}} references, e.g. {{#2.email}}. On a table trigger the settings (tableId, tableEventType, viewId, fieldIds, statusValues, daysBeforeApproaching) are written on the node's data, where the trigger reads them; any other key is refused. An Event Trigger is set with accountEvents_setFlowEventTrigger instead (refused here).

Parameters

flowIdstringrequired

Flow ID

nodeIdstringrequired

Node ID within the flow (from getById — node ids live in the nodes array)

configobjectrequired

The node's config object — REPLACES the node's existing config, so read the current config via getById first and send the full merged object. The shape depends on the node type: call getAvailableNodes (and getHelp for worked examples) to see each type's config fields. Values support {{template}} references to prior node outputs, e.g. {{#2.email}}. On a table trigger the settings (tableId, tableEventType, …) are written on the node's data, where the trigger reads them; an Event Trigger is set with accountEvents_setFlowEventTrigger instead.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/updateNodeConfig \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "nodeId": "example",
  "config": {}
}'
POST
/api/v1/flow/editNodeConfig

Edit node config by merging partial updates. Only provided fields are updated, existing fields preserved. Use this for adding mappings. Params: flowId, nodeId, config (partial object). On a table trigger the settings (tableId, tableEventType, viewId, fieldIds, statusValues, daysBeforeApproaching) are written on the node's data, where the trigger reads them; any other key is refused. An Event Trigger is set with accountEvents_setFlowEventTrigger instead (refused here).

Parameters

flowIdstringrequired

Flow ID

nodeIdstringrequired

Node ID within the flow

configobjectrequired

Partial config to merge. Only provided fields are updated, existing fields are preserved. On a table trigger the settings (tableId, tableEventType, …) are written on the node's data, where the trigger reads them; an Event Trigger is set with accountEvents_setFlowEventTrigger instead.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/editNodeConfig \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "nodeId": "example",
  "config": {}
}'
POST
/api/v1/flow/delete

Delete a flow. Param "id" is flow ID. WARNING: Permanent. Act only on what the person named or picked.

Parameters

idstringrequired

Flow ID to delete

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/delete \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/flow/createWebhook

Create webhook trigger for a flow. Params: flowId, triggerId (trigger node ID). Returns webhook with token and URL.

Parameters

flowIdstringrequired

Flow ID

triggerIdstringrequired

Trigger node ID in the flow

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/createWebhook \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "triggerId": "example"
}'
POST
/api/v1/flow/getWebhook

Get webhook details. Params: flowId, triggerId (trigger node ID). Returns the live webhook link: treat it as a password (so this is a write tool that needs an edit role: a read-only connection or a Viewer is refused it).

Parameters

flowIdstringrequired

Flow ID the trigger belongs to

triggerIdstringrequired

Trigger node ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getWebhook \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "triggerId": "example"
}'
POST
/api/v1/flow/deleteWebhook

Delete a flow's webhook trigger. Params: flowId, triggerId (trigger node ID). Act only on what the person named or picked.

Parameters

flowIdstringrequired

Flow ID the trigger belongs to

triggerIdstringrequired

Trigger node ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/deleteWebhook \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "triggerId": "example"
}'
POST
/api/v1/flow/createSchedule

Create a flow's schedule trigger. Params: flowId, triggerId (trigger node ID), cronExpression (5 parts: minute hour day month weekday), timezone (default UTC). Example: "0 9 * * *" for 9am daily.

Parameters

flowIdstringrequired

Flow ID

triggerIdstringrequired

Trigger node ID

cronExpressionstringrequired

Cron expression (5 parts): minute hour day month weekday. Example: "0 9 * * *" for 9am daily

timezonestring

Timezone (default: UTC). Example: "America/New_York"

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/createSchedule \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "triggerId": "example",
  "cronExpression": "example"
}'
POST
/api/v1/flow/getSchedule

Get a flow's schedule trigger. Param "triggerId" (trigger node ID).

Parameters

triggerIdstringrequired

Trigger node ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getSchedule \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "triggerId": "example"
}'
POST
/api/v1/flow/updateSchedule

Update a flow's schedule trigger. Params: triggerId, cronExpression, timezone.

Parameters

triggerIdstringrequired

Trigger node ID

cronExpressionstringrequired

Cron expression (5 parts): minute hour day month weekday

timezonestringrequired

Timezone. Example: "America/New_York", "UTC"

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/updateSchedule \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "triggerId": "example",
  "cronExpression": "example",
  "timezone": "example"
}'
POST
/api/v1/flow/deleteSchedule

Delete a flow's schedule trigger. Param "triggerId" (trigger node ID). Act only on what the person named or picked.

Parameters

triggerIdstringrequired

Trigger node ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/deleteSchedule \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "triggerId": "example"
}'
POST
/api/v1/flow/getExecutions

Get execution history for a flow with pagination. Params: flowId (required), limit (1-50, default 10), cursor (from previous response).

Parameters

flowIdstringrequired

Flow ID

limitnumber

Max results (1-50, default 10)

cursorstring

Pagination cursor from previous response

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getExecutions \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "limit": 0,
  "cursor": "example"
}'
POST
/api/v1/flow/getExecutionDetails

Get detailed execution info including node results. Params: executionId, includeFullData (boolean, for copying data).

Parameters

executionIdstringrequired

Execution ID from getExecutions

includeFullDataboolean

Include full node results (for copying data)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getExecutionDetails \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "executionId": "example",
  "includeFullData": true
}'
POST
/api/v1/flow/getActiveExecution

Get the most recent running execution for a flow. Param "flowId".

Parameters

flowIdstringrequired

Flow ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getActiveExecution \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example"
}'
POST
/api/v1/flow/getActiveExecutions

Get all currently running executions for a flow. Param "flowId".

Parameters

flowIdstringrequired

Flow ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getActiveExecutions \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example"
}'
POST
/api/v1/flow/getSnapshots

Get flow version history (snapshots). Each save creates a snapshot for rollback. Params: flowId, cursor (optional), limit (1-50, default 20).

Parameters

flowIdstringrequired

Flow ID

cursorstring

Pagination cursor

limitnumber

Max results (1-50, default 20)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getSnapshots \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "cursor": "example",
  "limit": 0
}'
POST
/api/v1/flow/deleteSnapshot

Delete a snapshot. Cannot delete the latest snapshot. Param "snapshotId". Act only on what the person named or picked.

Parameters

snapshotIdstringrequired

Snapshot ID from getSnapshots

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/deleteSnapshot \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "snapshotId": "example"
}'
POST
/api/v1/flow/restoreFromSnapshotById

Restore flow nodes and edges from a previous snapshot. Params: flowId, snapshotId.

Parameters

flowIdstringrequired

Flow ID

snapshotIdstringrequired

Snapshot ID to restore from

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/restoreFromSnapshotById \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "snapshotId": "example"
}'
POST
/api/v1/flow/stopExecution

Stop a running execution. Param "executionId". Act only on what the person named or picked.

Parameters

executionIdstringrequired

Execution ID to stop

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/stopExecution \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "executionId": "example"
}'
POST
/api/v1/flow/runManualFlow

Execute a flow manually. Params: flowId (required), triggerData (optional object), triggerId (optional, uses manual trigger if not specified), executionMode ("test" (pinned data: steps that have pinned output use it) or "live" (live data: every step runs for real); only for this run. Triggered runs always do every step for real.). WHO RUNS IT: a flow runs as the workspace — whoever builds it decides what it can do and can only wire what they may use; anyone in the workspace can run it unless its "Who can run this flow" names who may (the Owner and Admins always can; its own triggers always start it). The person who started it is passed in as data: {{run.startedBy.name}}, {{run.startedBy.role}}, {{run.startedBy.kind}} — for personalising and logging, never rights.

Parameters

flowIdstringrequired

Flow ID to execute

triggerDataobject

Data to pass to the trigger node

triggerIdstring

Specific trigger node ID (uses manual trigger if not specified)

executionIdstring

Custom execution ID for a NEW run (generated if not provided); an id already in use is refused

executionModestring

Execution mode: "test" uses pinned data, "live" runs normally

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/runManualFlow \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "triggerData": {},
  "triggerId": "example"
}'
POST
/api/v1/flow/pinNodeData

Pin data to a node for testing: when the flow is in Pin mode, that step uses the pinned output instead of running. Pinned data is used only when you press Run here; every triggered run does every step for real. Params: flowId, nodeId, input (optional), output (required - the pinned data).

Parameters

flowIdstringrequired

Flow ID

nodeIdstringrequired

Node ID to pin data to

inputany

Input data to pin

outputany

Output data to pin - used as fixed output in test mode

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/pinNodeData \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "nodeId": "example",
  "input": {}
}'
POST
/api/v1/flow/unpinNodeData

Remove pinned data from a node so it executes normally. Params: flowId, nodeId.

Parameters

flowIdstringrequired

Flow ID

nodeIdstringrequired

Node ID to unpin

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/unpinNodeData \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "nodeId": "example"
}'
POST
/api/v1/flow/toggleActive

Toggle flow active/inactive. Param "flowId"; optional "expectActive" (whether it is on now, as you last saw it — if it changed since, nothing is changed). Inactive flows do not process webhook or schedule triggers.

Parameters

flowIdstringrequired

Flow ID

expectActiveboolean

Whether the flow is on now (as you last saw it). If it is no longer in that state, nothing is changed.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/toggleActive \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "expectActive": true
}'
POST
/api/v1/flow/enterListenMode

Show the next real runs of a flow live in the editor; the flow still runs as usual. Params: flowId, triggerType ("webhook" or "table"), duration (ms, 1 second to 15 minutes, default 5 minutes).

Parameters

flowIdstringrequired

Flow ID

triggerTypestringrequired

Type of trigger to listen for

durationinteger

Listen duration in ms (1 second to 15 minutes; default 5 minutes)

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/enterListenMode \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "triggerType": "example",
  "duration": {}
}'
POST
/api/v1/flow/exitListenMode

Stop watching a flow's runs in the editor — for everyone in the workspace on that flow. Param "flowId".

Parameters

flowIdstringrequired

Flow ID

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/exitListenMode \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example"
}'
POST
/api/v1/flow/cancelQueuedFlow

Cancel a flow run that is still waiting for a free slot (it has not started yet): it is taken out of the waiting list and never starts. Param: executionId (the id the run was given when it was started). Anyone who may run the flow can cancel its waiting runs. A run that has already started, finished or been cancelled, or does not exist, answers that no waiting run was found; stop a running one with stopExecution. Returns { success: true, cancelled: true } when the run was taken out. Act only on what the person named or picked.

Parameters

executionIdstringrequired

Execution ID of the queued flow

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/cancelQueuedFlow \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "executionId": "example"
}'
POST
/api/v1/flow/getHelp

Get focused help for Flows API. Call when a parameter shape is unclear (one call per topic). Topics: - "overview": What flows are, quick start, node types - "nodes": Node structure, connecting nodes - "triggers": Manual, webhook, schedule triggers - "execution": Running flows, viewing history - "testing": Pinning data, test mode, listen mode Example: getHelp({topic: "triggers"}) before setting up webhooks.

Parameters

topicstring

Topic: "overview", "nodes", "triggers", "execution", "testing"

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getHelp \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "topic": "example"
}'
POST
/api/v1/flow/getAccessRules

Get the execute access rules for a flow (who may invoke it from a published app via flows.invoke), and hasHome (true when the flow already belongs to a site). Its home sites (`sites`) list only the sites you may open; saving the list keeps any you can't see. Param: id (flow ID).

Parameters

idstringrequired

Flow ID from list

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example"
}'
POST
/api/v1/flow/setAccessRules

Set who may invoke a flow from published apps via flows.invoke(). Flows are DENY-BY-DEFAULT — without rules only the owner can invoke. A flow a page starts runs as the workspace (it can read any of the owner's bases): only what its response node returns reaches the visitor. Params: id (flow ID), accessRules ({ execute: Condition, sites?: [siteId] } — same shape as backend-function rules). sites = the flow's HOME sites: only their members count for signed-in / role / plan / property rules, and through any other site the flow runs only if its rule says "Anyone, everywhere". Public has two levels: { type: "public", scope: "home" } = "Anyone on this site" (only through its home sites) and { type: "public", scope: "everywhere" } = "Anyone, everywhere". A public rule with no level keeps the saved one; made public now on a flow with home sites it starts as "Anyone on this site"; a flow with NO sites made public must name its sites or say scope "everywhere" — refused otherwise. Saving is checked like any flow save: you may only save rules you may change (refused if the flow holds something the person you act for may not use). Leaving `sites` out keeps the saved list.

Parameters

idstringrequired

Flow ID from list

accessRulesobjectrequired

{ execute: Condition, sites?: [siteId] } — same shape as backend-function rules (public/authenticated/has_role/user_property/policy refs, or {all|any|not} groups). `sites` = the flow's home sites: only their members count for signed-in/role/plan/property rules, and only they can run it unless it is "Anyone, everywhere" (left out = keep the saved list). A public leaf has two levels: { type: "public", scope: "home" } = "Anyone on this site" (through its home sites only — what a newly public flow with home sites starts as; a flow with no sites made public must name them or say "everywhere") and { type: "public", scope: "everywhere" } = "Anyone, everywhere" (through any of your sites). Saving is checked like any flow save: you may only save rules you may change. Missing/empty execute = nobody can invoke from the published app (the owner always can). Example public form flow on one site: { execute: [{ type: "public", scope: "home" }], sites: ["<siteId>"] }.

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/setAccessRules \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "id": "example",
  "accessRules": {}
}'
POST
/api/v1/flow/getWhoCanRun

"Who can run this flow" (teammates and agents, not site visitors): { everyone, roles, people, agents } — everyone: true when no list is set — and powers: what anyone who can run it can use it to do, in words. The Owner and Admins can always run it; its own triggers always start it. Param: flowId.

Parameters

flowIdstringrequired

Flow ID from list

withChangeRefusalboolean

Also say whether you may change the list, and why not (the whole save check: ask it only when about to change it).

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/getWhoCanRun \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "withChangeRefusal": true
}'
POST
/api/v1/flow/setWhoCanRun

Set "Who can run this flow": everyone in the workspace (everyone: true), or the Owner, Admins and the roles (admin, editor = Developer, viewer), member user ids and agent ids you name. Running, stopping and raising an event that fires it follow the list; its own triggers always start it. Changing it is a save: refused if the flow holds something the person you act for may not use. Params: flowId, everyone, roles, people, agents.

Parameters

flowIdstringrequired

Flow ID from list

everyonebooleanrequired

true: everyone in the workspace can run it (the lists are ignored)

rolesarrayrequired

Roles that can run it: admin, editor (Developer), viewer

peoplearrayrequired

Member user ids that can run it

agentsarrayrequired

Agent ids that can run it

Example Request

curl -X POST https://app.serenitiesai.com/api/v1/flow/setWhoCanRun \
  -H "Authorization: Bearer mk_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
  "flowId": "example",
  "everyone": true,
  "roles": {}
}'