/actions page.

Core actions
Core actions are Tracecat’s built-in primitives for requests, transforms, workflow control, cases, and tables. Each third-party integration undertools.* is a YAML template built from these core action steps, or a Python UDF.
See Core actions for every core action and its inputs, and the integrations overview for the full catalog.
- Requests: HTTP, SQL, SSH, gRPC, Email
- Transforms: Reshape, Python script, Data transforms, Require
- Workflow: Run subflow, Scatter-gather loops, While loops
- Cases: Cases
- Tables: Tables
Action names
Every Tracecat action has a title, namespace, and name. Actions IDs are defined as<namespace>.<name>. For example, tools.slack.post_message uses the tools.slack namespace and the post_message name.
Action types
Tracecat actions are defined in either Python UDFs (user-defined functions) or YAML templates (domain-specific language for actions). See Custom actions for more details.Action toolbar
If you’re building workflows in the UI, you can quickly find actions by namespace using the actions toolbar:
corefor built-in utilities such as HTTP requests, Python scripts, email, and gRPC actionsaifor non-agent AI actionsaialso powers the separateAgentgroup for actions such asai.agentandai.preset_agentcore.workflowfor workflow actions, plus scatter and gather helperscore.transformfor transform actionscore.casesfor case actionscore.tablefor table actionscore.sqlandcore.duckdbfor SQL actionstools.*for installed integrations; this menu also supports search
Expressions
Expressions use${{ ... }}.
Use these references inside expressions:
TRIGGER.<field>ACTIONS.<ref>.resultSECRETS.<name>.<KEY>VARS.<name>.<key>ENV.<field>var.<name>FN.<name>(...)
Success and error paths
Every action has a success and error path. The success path, which is represented by the green dot, runs when the action succeeds. The error path, which is represented by the red dot, runs when the action fails.
Control flow
You can configure how an action runs from the “Control flow” tab in the action panel.
Mask output
Usemask_output to hide an action’s result in workflow execution views and execution API responses. Tracecat keeps the object and array shape, but replaces each individual value with [REDACTED].
You can still copy JSONPath references from the displayed structure. mask_output only affects display; downstream actions can still use the original result with expressions such as ${{ ACTIONS.lookup_user.result.id }}.
Run if
Userun_if to execute an action only when a condition evaluates to a truthy value. If the condition is falsy, Tracecat skips the action.
For each
Usefor_each to run the same action once per item in a collection. If items contains N values, Tracecat runs the action N times.
Inside the action inputs, reference the current item with var.<name>. For example, for_each: ${{ for var.user in TRIGGER.users }} runs the action len(TRIGGER.users) times, and each run reads the current item from var.user.
Join strategy
join_strategy controls how a downstream action waits on multiple upstream branches. Use all to wait for every branch, or any to continue after the first branch completes.
Environment
Useenvironment to override which secrets or variables environment an action reads from.
This is useful to target different secrets or variables for the same pre-built action (e.g. different Slack apps for tools.slack.post_message).
Start delay
Usestart_delay to wait a fixed number of seconds before an action starts.
Timeout
Usetimeout to cap how long Tracecat waits for an action attempt to finish.
Defaults to 300 seconds.
For ai.agent, ai.action, and ai.preset_agent, timeout caps the agent’s active runtime in seconds. Unset means 1800 seconds (30 minutes).
Tracecat clamps an explicit value between 1800 seconds and TRACECAT__AGENT_SANDBOX_TIMEOUT, which defaults to 3600 seconds (see Environment variables). Tracecat stores the clamped value instead of rejecting the action. A ceiling below 1800 seconds lowers both the default and the floor to the ceiling.
A pause for a tool approval does not count toward the timeout, and the resumed run gets the full timeout again.
Agent execution timed out after 2700s. The workflow-level timeout still bounds the whole run, including approval waits.
Max attempts
Usemax_attempts to control how many times Tracecat retries the action if it fails.
Defaults to 1 attempt.
FAQ
Why does my run_if or for_each expression fail validation?
Why does my run_if or for_each expression fail validation?
Most validation errors come from expression shape rather than action behavior:
- Wrap the whole expression once as
${{ ... }}. Do not split one condition across multiple expression blocks. run_ifmust evaluate to a boolean value such as${{ TRIGGER.severity == "high" }}.- Use comparison operators such as
==and!=. A single=is not a valid comparison. for_eachmust use the iteration form${{ for var.item in ... }}and the value on the right side must be a list.