Workflows
Workflows are node-graph pipelines you build, version, deploy, and run. Use this resource to author a workflow, manage its nodes and connections, run it (synchronously or fire-and-forget), and share it.
Access it as client.workflows on a Strongly client, or the same path on AsyncStrongly with await. All methods exist on both with identical signatures.
Quick start
from strongly import Strongly
client = Strongly()
# List (auto-paginates as you iterate) # filters: status, search, tag
for workflow in client.workflows.list():
print(workflow.id)
Methods
Core
list
list(*, status: str | None = None, search: str | None = None, tag: str | None = None, limit: int | None = None) -> SyncPaginator[Workflow]
List workflows with pagination and filtering.
Parameters
status(str | None, optional): Filter by workflow status ("draft","active","paused","archived").search(str | None, optional): Search by name or description.tag(str | None, optional): Filter by tag.limit(int | None, optional): Maximum number of items to return (default: all matching items).
create
create(*, name: str, description: str | None = None, status: str | None = None, workflow_type: str | None = None, tags: Sequence[str] | None = None, nodes: Sequence[Mapping[str, Any]] | None = None, connections: Sequence[Mapping[str, Any]] | None = None, settings: Mapping[str, Any] | None = None) -> Workflow
Create a new workflow.
Parameters
name(str): Workflow name (required).description(str | None, optional): Workflow description.status(str | None, optional): Initial status (default:"draft").workflow_type(str | None, optional): Execution mode:"batch"(default) or"streaming".tags(Sequence[str] | None, optional): Tags for the workflow.nodes(Sequence[Mapping[str, Any]] | None, optional): Initial graph nodes (free-form node objects).connections(Sequence[Mapping[str, Any]] | None, optional): Initial graph connections (free-form connection objects).settings(Mapping[str, Any] | None, optional): Workflow settings (free-form, e.g.spanLevel,retryAttempts).
retrieve
retrieve(workflow_id: str) -> Workflow
Get a single workflow by ID.
update
update(workflow_id: str, *, name: str | None = None, description: str | None = None, status: str | None = None, tags: Sequence[str] | None = None, nodes: Sequence[Mapping[str, Any]] | None = None, connections: Sequence[Mapping[str, Any]] | None = None, config: Mapping[str, Any] | None = None, settings: Mapping[str, Any] | None = None, max_concurrent_runs: int | None = None) -> Workflow
Update a workflow.
Parameters
workflow_id(str): The workflow ID.name, description, status, tags: Flat metadata to update.nodes, connections(Sequence[Mapping[str, Any]] | None, optional): Full graph node/connection lists (free-form).config(Mapping[str, Any] | None, optional): Workflow config object (free-form).settings(Mapping[str, Any] | None, optional): Workflow settings object (free-form). Replaces the stored settings object, so read-modify-write to preserve other keys.max_concurrent_runs(int | None, optional): How many of the workflow's runs may be in flight at once, 1-10 (default 1). A Queue trigger keeps this many messages' runs going. Like every update, refused while the workflow is deployed.
delete
delete(workflow_id: str) -> None
Delete a workflow.
Lifecycle & actions
start
start(workflow_id: str) -> Workflow
Start a deployed workflow (long-running types).
stop
stop(workflow_id: str) -> Workflow
Stop a running workflow.
deploy
deploy(workflow_id: str, **kwargs) -> Workflow
Deploy a workflow.
Parameters
workflow_id(str): The workflow ID.**kwargs(Any): Optional deployment configuration.
undeploy
undeploy(workflow_id: str) -> Workflow
Undeploy a workflow.
execute
execute(workflow_id: str, *, definition: Mapping[str, Any] | None = None, trigger_inputs: Mapping[str, Any] | None = None) -> dict[str, Any]
Execute a workflow.
Parameters
workflow_id(str): The workflow ID.definition(Mapping[str, Any] | None, optional): Optional graph definition override (nodes + connections); defaults to the stored workflow definition.trigger_inputs(Mapping[str, Any] | None, optional): Input data for the trigger node.
Returns
dict[str, Any]: Dict containingexecutionId.
Other
add_connection
add_connection(workflow_id: str, *, source_node_id: str, target_node_id: str, source_port: str | None = None, target_port: str | None = None, feedback: bool | None = None, max_iterations: int | None = None) -> dict[str, Any]
Add a connection between two nodes.
Parameters
workflow_id(str): The workflow ID.source_node_id(str): Source node ID.target_node_id(str): Target node ID.source_port(str | None, optional): Source port, one of the source node's declared outputs (default"output"):"continue"for a loop body,"output"for a map body,"completed"from a loop or map into its Loop Accumulator,"if"/"else"from a conditional,"case_<n>"/"default"from a switch-case.target_port(str | None, optional): Target port (default"input"; use"ai"or"tools"for agent nodes).feedback(bool | None, optional): Mark this as a streaming feedback edge (closes a loop). Must be paired withmax_iterations.max_iterations(int | None, optional): Bound on feedback-edge iterations per session. Required whenfeedbackisTrue.
add_member
add_member(resource_id: str, *, user_id: str, role: str) -> Permissions
Share the resource with a user.
Parameters
resource_id(str): The resource's id.user_id(str): The user to share it with.role(str):"editor"(use and change it) or"user"(use it only; types without a use-only tier, such as knowledge bases, take"editor"only).
add_node
add_node(workflow_id: str, *, node_id: str, label: str | None = None, version: str | None = None, config: Mapping[str, Any] | None = None, position: Mapping[str, Any] | None = None) -> dict[str, Any]
Add a node to a workflow graph.
Parameters
workflow_id(str): The workflow ID.node_id(str): Catalog node identifier (e.g."webhook","ai-gateway").label(str | None, optional): Optional custom label for the node.version(str | None, optional): Optional catalog version to pin (default: catalog latest).config(Mapping[str, Any] | None, optional): Initial node configuration (free-form).position(Mapping[str, Any] | None, optional): Canvas position{x, y}(free-form).
build
build(*, name: str, nodes: Sequence[Mapping[str, Any]], connections: Sequence[Mapping[str, Any]] | None = None, workflow_type: str | None = None, **extra) -> Workflow
Create a whole workflow graph in one call and return the workflow.
Give every node (id, type, label, config, input_mappings) and every
connection (source, target and their ports); nodes and connections are sent as
given. extra takes the workflow's other fields (description, tags, ...).
create_alert_rule
create_alert_rule(*, name: str, condition: str, channels: Sequence[Mapping[str, Any]], workflow_id: str | None = None, condition_config: Mapping[str, Any] | None = None, throttle: Mapping[str, Any] | None = None, is_enabled: bool | None = None, description: str | None = None) -> dict[str, Any]
Create a workflow alert rule.
You are alerted on each channel when a run of the workflow (or of any
of your workflows, with no workflow_id) ends meeting condition.
Parameters
name(str): The rule's name.condition(str):execution_failed,execution_timeout,execution_completed,duration_exceeded,node_failed,consecutive_failuresordlq_threshold.channels(Sequence[Mapping[str, Any]]):{"type": "in_app", "config": {}}(your bell),email(emailAddresses; none = your address),slack(slackWebhookUrl) orwebhook(webhookUrl).workflow_id(str | None, optional): The workflow; omit for all your workflows.condition_config(Mapping[str, Any] | None, optional):durationThresholdMs,nodeTypes,failureCountordlqCountThreshold, per condition.throttle(Mapping[str, Any] | None, optional):{"enabled": bool, "intervalMinutes": int}(default off).is_enabled(bool | None, optional): DefaultTrue.description(str | None, optional): What the rule is for.Returns ``{"id": <rule id>}``.
create_from_template
create_from_template(template_id: str, *, name: str | None = None, description: str | None = None, tags: Sequence[str] | None = None) -> Workflow
Create a draft workflow from a template (from templates).
create_version
create_version(workflow_id: str, *, version_tag: str, description: str | None = None) -> dict[str, Any]
Create a new workflow version.
Parameters
workflow_id(str): The workflow ID.version_tag(str): The version tag (e.g."v2").description(str | None, optional): Optional description for this version.
delete_alert_rule
delete_alert_rule(rule_id: str) -> None
Delete one of your workflow alert rules; its alerts stay in the history.
delete_connection
delete_connection(workflow_id: str, connection_id: str) -> None
Remove a connection.
delete_node
delete_node(workflow_id: str, node_id: str) -> None
Remove a node from a workflow graph.
dependency_access
dependency_access(workflow_id: str, *, for_: str | None = None) -> dict[str, Any]
List the dependencies you may not use, with their owners.
for_ is run or deploy.
deploy_version
deploy_version(workflow_id: str, version_id: str, **resources) -> Workflow
Deploy a saved version as the live deployment (roll back or forward).
Returns the workflow, its deployment_status queued: the deployment runs on after
this answers; poll status. resources may set environment_id, cpu,
memory, disk, gpu and gpu_type.
discover
discover(**params) -> dict[str, Any]
Discover workflows by capability / tag / search.
duplicate
duplicate(workflow_id: str) -> Workflow
Duplicate a workflow and return the copy.
emit_event
emit_event(*, event_type: str, event_data: Mapping[str, Any] | None = None, source: str | None = None) -> dict[str, Any]
Emit a platform event that starts the deployed workflows listening to it.
It starts every deployed workflow you may use whose Event trigger
listens for event_type, each run as you. Drafts never start.
workflow.completed / workflow.failed are
also emitted by the platform when a run ends; an Event trigger with a
Source Workflow hears those only from that workflow. Returns
{event_type, workflows_triggered, workflows_failed, results}, each
result naming the started run's executionId or the error that
kept that workflow from starting.
Parameters
event_type(str): The event type to emit (required).event_data(Mapping[str, Any] | None, optional): Event payload (free-form).source(str | None, optional): Optional event source label.
export
export(workflow_id: str) -> dict[str, Any]
Export a workflow as a portable JSON bundle.
import_bundle
import_bundle(*, export_data: Mapping[str, Any], resolved_deps: Mapping[str, Any] | None = None) -> dict[str, Any]
Import a workflow from a previously exported JSON bundle.
Parameters
export_data(Mapping[str, Any]): The exported workflow JSON data (free-form bundle).resolved_deps(Mapping[str, Any] | None, optional): Resolved dependency mappings (free-form). Omit for a validation-only pass; supply to execute the import.
layout
layout(workflow_id: str) -> dict[str, Any]
Compute an auto-layout for the workflow graph.
lifecycle
lifecycle(workflow_id: str) -> dict[str, Any]
Get lifecycle metadata for a workflow.
list_alert_rules
list_alert_rules(*, workflow_id: str | None = None, limit: int | None = None) -> SyncPaginator[WorkflowAlertRule]
List your workflow alert rules.
With workflow_id, the rules that apply to that workflow: its own
and your rules for all your workflows.
list_alerts
list_alerts(*, workflow_id: str | None = None, rule_id: str | None = None, limit: int | None = None) -> SyncPaginator[WorkflowAlert]
List the alerts your rules sent, newest first, a page at a time as you iterate.
Each alert has its run, condition, message, details and every channel's outcome (sent to whom, or why not).
list_nodes
list_nodes(workflow_id: str) -> dict[str, Any]
List nodes in a workflow graph.
logs
logs(workflow_id: str, *, lines: int | None = None, container: str | None = None) -> dict[str, Any]
Get recent log lines of a deployed workflow's pod.
metrics
metrics(workflow_id: str, *, window: str | None = None) -> dict[str, Any]
Get run counts by status, average duration, error rate and the last run.
permissions
permissions(resource_id: str) -> Permissions
Return who can reach the resource: its owner, members and their roles, and visibility.
Parameters
resource_id(str): The resource's id.
remove_member
remove_member(resource_id: str, user_id: str) -> None
Stop sharing the resource with a user.
Parameters
resource_id(str): The resource's id.user_id(str): The user to stop sharing it with.
retrieve_version
retrieve_version(workflow_id: str, version_id: str) -> dict[str, Any]
Get one saved version of a workflow, with its graph.
save_as_template
save_as_template(workflow_id: str) -> Workflow
Save a copy of a workflow as a reusable template and return it.
set_visibility
set_visibility(resource_id: str, visibility: str) -> Permissions
Make the resource public (every user can find and use it) or private.
Parameters
resource_id(str): The resource's id.visibility(str):"public"or"private".
stats
stats() -> WorkflowStats
Get workflow statistics (total, active, paused, draft, archived).
status
status(workflow_id: str) -> dict[str, Any]
Return a workflow's deployment status and how to invoke it.
Its deploymentStatus, pod and replica health, and, once it has a trigger,
the invocation block: the URL, auth mode and signing header callers use.
structure_check
structure_check(workflow_id: str) -> dict[str, Any]
Check the graph: broken connections, disconnected nodes, a missing trigger.
templates
templates() -> list[Workflow]
List workflow templates.
update_alert_rule
update_alert_rule(rule_id: str, *, name: str | None = None, condition: str | None = None, channels: Sequence[Mapping[str, Any]] | None = None, workflow_id: str | None = None, condition_config: Mapping[str, Any] | None = None, throttle: Mapping[str, Any] | None = None, is_enabled: bool | None = None, description: str | None = None) -> dict[str, Any]
Update one of your workflow alert rules.
Only the fields you pass change; is_enabled=False pauses it.
update_lifecycle
update_lifecycle(workflow_id: str, *, type: str, idle_timeout_minutes: int | None = None, schedule: Mapping[str, Any] | None = None) -> dict[str, Any]
Update the lifecycle policy for a workflow.
Parameters
workflow_id(str): The workflow ID.type(str): Policy type:"always-on","idle-shutdown","on-demand"or"scheduled-window".idle_timeout_minutes(int | None, optional): Minutes before idle shutdown (5-1440, default 30); used with"idle-shutdown".schedule(Mapping[str, Any] | None, optional): Schedule config (free-form), required for"scheduled-window":{timezone, windows: [{days, startTime, endTime}]}.
update_node
update_node(workflow_id: str, node_id: str, *, config: Mapping[str, Any] | None = None, label: str | None = None) -> dict[str, Any]
Update a node in a workflow graph.
Parameters
workflow_id(str): The workflow ID.node_id(str): The node ID within the workflow.config(Mapping[str, Any] | None, optional): Configuration key-value pairs to merge (free-form).label(str | None, optional): Optional new label for the node.
update_node_input_mappings
update_node_input_mappings(workflow_id: str, node_id: str, *, mappings: Mapping[str, Any]) -> dict[str, Any]
Replace a node's input mappings.
Parameters
workflow_id(str): The workflow ID.node_id(str): The node ID within the workflow.mappings(Mapping[str, Any]): Input mapping object (free-form), e.g.{targetField: "data.sourceField"}.
update_node_passthrough_values
update_node_passthrough_values(workflow_id: str, node_id: str, *, values: Mapping[str, Any]) -> dict[str, Any]
Replace a node's passthrough values (saved to node.config.passThroughValues).
Each entry copies one of the node's inputs into its output, so the
next node can map it as data.<outputKey>.
Parameters
workflow_id(str): The workflow ID.node_id(str): The node ID within the workflow.values(Mapping[str, Any]):{outputKey: "inputName"}, where eachinputNameis one of the node's inputs (aninputMappingskey). An input name the node does not map is skipped at run time.
update_status
update_status(workflow_id: str, *, status: str) -> dict[str, Any]
Update workflow status.
Parameters
workflow_id(str): The workflow ID.status(str): New status. Must be one of"draft","active","paused","archived".
validate
validate(workflow_id: str) -> dict[str, Any]
Validate a workflow graph and return errors/warnings.
versions
versions(workflow_id: str) -> WorkflowVersionInfo
List version history for a workflow.