Skip to main content

Reference

Field-by-field reference for every node and connection type, grouped by kind and listed alphabetically. Use it to look up exactly what a node or connection exposes—its configuration fields, the options each one offers, and what a node outputs for later steps to read.

For task-oriented guidance, see the rest of the user guide—Building automations, Triggers, Actions, and the others.

Every node also carries a Display tab with optional Title and Description fields, not repeated in the field tables below—see Building automations.

Triggers

How automations start. See Triggers for choosing one.

Automation Completed trigger

Starts the automation when another automation finishes. Shown in the picker as Automation Completed, under General Triggers.

Fields

FieldRequiredDescription
Target AutomationYesThe automation to watch for completion.
OutcomesYesWhich terminal outcomes to react to—Succeeded, Failed, or both. At least one is required.

The target cannot be the automation that owns the trigger.

Output

A completion snapshot of the target run: its execution identity, the payload that originally triggered it, timing, and—when it failed—an error summary.

Content trigger

Starts the automation when a content event occurs in a connected Brightspot CMS. Shown in the picker as Content, under Integration Triggers. Requires a Brightspot connection.

Fields

FieldRequiredDescription
ConnectionYesThe Brightspot connection whose CMS to watch.
SitesNoLimit to specific sites. Leave unset to match any site.
EventYesThe content event to fire on (see below).
FiltersNoNarrow which content matches. With none, all content matches.

Events

Published, Drafted, Revised, Merged, Scheduled, Unscheduled, Transitioned (a workflow transition), Archived, Restored, Deleted, Commented, and On Demand.

Filters

FilterMatches on
TypesOne or more content types.
FieldA field's value on the content.
ContentSpecific assets.
Match AllA group of filters that must all match.

Output

The event's payload—the affected content and event metadata. The exact shape depends on the selected event.

GitHub trigger

Starts the automation on a GitHub webhook event for a chosen repository. Shown in the picker as GitHub, under Integration Triggers. Requires a GitHub connection.

Fields

FieldRequiredDescription
ConnectionYesThe GitHub connection to use.
RepositoryYesThe repository to watch, as organization/repository.
EventYesThe event to fire on (see below).

Events

Push, Pull Request, Issues, Issue Comment, Pull Request Review, Pull Request Review Comment, Release, Create, Delete, and Workflow Run. Pull Request and Issues can be limited to specific actions; Create and Delete can be limited to branches or tags.

Output

The GitHub event's payload. The exact shape depends on the selected event.

Jira trigger

Starts the automation on a Jira event for a chosen project. Shown in the picker as Jira, under Integration Triggers. Requires a Jira connection.

Fields

FieldRequiredDescription
ConnectionYesThe Jira connection to use.
ProjectYesThe Jira project to watch.
JQL FilterNoAn optional JQL refinement, combined with the project filter—for example, priority in (High, Highest).
EventYesThe event to fire on (see below).

Events

Issue Created, Issue Updated, Issue Deleted, Comment Added, and Comment Updated. Issue Updated can be limited to changes in specific fields.

Output

The event's payload—the issue or comment involved.

note

Depending on the connection's authentication, the Jira webhook is registered automatically (OAuth) or set up by an administrator (API token). The node shows the current setup status.

On Demand trigger

Starts the automation when you run it yourself—with Run Automation in the editor—or when another automation calls it. Shown in the picker as On Demand, under General Triggers.

Fields

FieldRequiredDescription
PayloadNoThe structured input the run starts with—a Content Type (an existing content type's fields) or a Custom Shape (fields you define on the trigger). Leave unset (None) to start with no input.

Output

If a payload is set, the trigger outputs its fields for later steps to read. With no payload, it produces no output.

Schedule trigger

Starts the automation on a recurring schedule, or immediately when you run it yourself with Run Automation. Shown in the picker as Schedule, under General Triggers.

Fields

FieldRequiredDescription
PayloadNoStructured input for each scheduled run—a Content Type or a Custom Shape. Leave unset for none.
ScheduleYesThe recurrence, set as a cron expression.

Output

If a payload is set, the trigger outputs its fields; otherwise it produces no output.

note

The system checks for due schedules about once a minute, so a schedule that fires more often than once a minute may skip runs.

Webhook trigger

Starts the automation when an external system sends an HTTP POST to a generated URL. Shown in the picker as Webhook, under General Triggers.

Fields

FieldRequiredDescription
NameYesA label used as the node's name in the editor.
URLThe endpoint to POST to. Generated automatically and read-only.
Signing SecretA secret the external system signs its requests with. Generated on first save and kept stable afterward, so the sender's copy stays valid; unsigned requests are rejected.

Node actions

When the URL and signing secret are set, the node offers:

  • Fire Test—send a test delivery to confirm the wiring.
  • Deliveries—review past delivery attempts.

Output

The trigger does not define a fixed output schema; downstream steps read the posted request data through the variable picker.

Actions

The steps that do work. See Actions, Integrations, and AI and agents.

AI Agent action

Runs an AI agent on the automation server, drawing tools from one or more MCP servers. Shown in the picker as AI Agent, under AI Actions. Needs no connection. Supports human-in-the-loop.

Fields

FieldRequiredDescription
TemplateNoA reusable agent from the Agents catalog that steers how this step approaches its task. The prompt below is sent as the task on top of it.
PromptYesThe natural-language task for the agent. Accepts variables, so it can work on the trigger's data and earlier results.
MCP ServersNoThe tool sources the agent may use—a Brightspot environment or any MCP server. Add more than one to let the agent work across systems in a single run.
Payload TypeNoAn output shape the agent populates as structured data, in addition to its message.
Human in the LoopNoOpt-in. Set it to let the agent pause and ask a person before finishing, and choose the Providers the question is pushed to (for example, Slack)—every request is also answerable from the AI Approvals inbox. Left unset, the agent must finish on its own.

The node's Display-tab Description, when left blank, falls back to the start of the prompt.

Human-in-the-loop

When Human in the Loop is set, the agent can pause to ask a person for input—a choice or free text. The step waits until the request is answered, then the agent resumes with the answer.

Output

FieldDescription
messageThe agent's text response.
payloadThe structured result, when a payload type is set.

Automation action

Runs another automation through its on-demand trigger. Shown in the picker as Automation, under General Actions. Needs no connection.

Fields

The action carries one operation, Trigger, with these fields:

FieldRequiredDescription
Target AutomationYesThe automation to run.
Target TriggerYesWhich on-demand trigger of the target to start.
Input PayloadNoThe structured input to start the run with. Shown when the target trigger defines a Content Type payload.
Input Payload (JSON)NoThe input as a JSON object instead. Shown when the target trigger defines a Custom Shape payload; accepts variables, and must evaluate to a JSON object matching that shape.
Wait For CompletionNoWhen on, this step waits for the target to finish and outputs its completion snapshot—a failed outcome can follow the error path. When off (default), it starts the target and continues immediately.

Output

  • Fire-and-forget (wait off): a receipt identifying the run that was started.
  • Wait for completion (wait on): a completion snapshot with the outcome, timing, and any error summary.

AWS AgentCore action

Invokes a hosted AWS Bedrock AgentCore agent. Shown in the picker as AWS AgentCore, under AI Actions. Supports human-in-the-loop.

Fields

FieldRequiredDescription
AgentYesThe hosted agent to invoke, chosen from your AWS environment's catalog of AgentCore agents.
InputYesWhat to send the agent—a Prompt (text, accepts variables) or JSON (a structured payload, accepts variables).
Long-term Memory ScopeNoHow much the agent recalls between runs: this run only; this node; this automation (the default); this agent across the site; or the whole site.
Human in the LoopNoOpt-in. Set it to let the agent pause and ask a person before finishing, and choose the Providers the question is pushed to (for example, Slack)—every request is also answerable from the AI Approvals inbox. Left unset, the agent must finish on its own.

Human-in-the-loop

When Human in the Loop is set, the agent can pause to ask a person for input; the step waits for the answer and the agent resumes. While the agent works, its progress streams into the run.

Output

The agent's result, together with run telemetry. The result's shape is defined by the agent.

Content action

Operates on content in a connected Brightspot CMS. Shown in the picker as Content, under Integration Actions. Requires a Brightspot connection.

Fields

FieldRequiredDescription
ConnectionYesThe Brightspot connection to act on.
Target Content IDNoA variable resolving to the ID of the content to operate on. Required for every operation except Save, where leaving it unset tells Save to create new content instead of updating existing content. If you bind a variable here and it resolves to nothing, the step fails rather than treating the empty value as a request to create.
OperationYesWhat to do (see below).

Operations

OperationDescriptionExtra fields
Fetch (deprecated)Read the target content by id. Superseded by the Content Fetch action, which can also look content up by a unique field. Existing steps keep working; new ones should use the action.
PublishPublish the target content.
SaveSave changes to the target content, create new content when no Target Content ID is set, or do either depending on whether the content exists (see Update, create, or both).Create If Missing—creates the content when nothing is there instead of failing. Content Type—the type to create as; hidden for a Save that can only update. Differences—a JSON object of field changes keyed by record id, covering the content and every embedded object inside it (see below). Site—optional; the site to save in. It defaults to the connection's site when it pins exactly one, and otherwise the content keeps the site it already has.
ArchiveArchive the target content.
DeleteDelete the target content.
RestoreRestore the target content.
TransitionMove the content through a workflow.Workflow and Transition to apply.
Post CommentPost a comment on the target content's conversation.The comment to post.
Complete Work Stream ItemMark the target content complete in a work stream, so the next run of a work-stream query skips it.Work Stream—the work stream to mark the content complete in, typically the Content Query node's work stream output.
What an operation returns

The content it acted on, as id — a Save reports what it created just as one that updated reports what it changed. The two comment operations are the exception, returning contentId and postId; their field names predate the rest and existing automations reference them.

Update, create, or both

Three configurations, and the fields you fill in say which one you mean:

Target Content IDContent TypeCreate If MissingWhat the step does
setoffUpdates the content at that id. Fails if nothing is there.
emptysetoffCreates new content.
setsetonUpdates the content at that id, or creates it there if nothing is there yet.
emptysetonUpdates or creates the content the Differences name, whichever is needed.

The last two are upserts, and they are opt-in—a Save you already have keeps updating only. Use one when the same automation has to cope with content that may or may not exist yet: syncing from an external system, re-running an import, or reusing a tag if it is already there.

The fourth row is the one to reach for after a Content Script. A Save with no target takes the id from the root of its Differences, and a script puts the right id there either way—the one it fetched, or the one it minted for content it just built. Nothing in the automation has to know which case it is in, so no branch is needed.

An upsert refuses to run if the content is of a different type, since applying one type's fields to another would set whatever happened to match and drop the rest.

Unlike a plain update, an upsert that changes nothing succeeds. It asks for content to exist in a given state rather than for a change to be made, and finding it already that way is the request being satisfied—the ordinary result of running one twice.

If Target Content ID is bound to a variable that resolves to nothing, the step fails rather than treating the empty value as a request to create. An id that was supposed to be there and isn't is always a mistake, never an instruction.

A Save with no target needs its Differences to name exactly one record that nothing else links to—that is the content being saved. An empty Differences is refused rather than treated as new content: hand an upsert the whole record rather than a diff, so the id survives even when nothing changed.

Differences

Differences is one JSON object covering everything the save changes, keyed by record id: the content's own id keys its own field changes, and each embedded object inside it is keyed by its own id.

1
{
2
"0000018f-1111-…": { "headline": "Storm closes harbor" },
3
"0000018f-2222-…": { "text": "The harbor at dawn" }
4
}

Build it with a Content Script node—dari.diff(...) produces exactly this shape, and doing it by hand means knowing the id of every embedded object in advance. See Content scripting.

When creating, the new content takes the id the map already uses for it, so a Content Script that builds the content also names it. A map that names no single root gets a generated id instead.

You do not have to include _id or _type for the content itself—the step fills both in from the id and type it is using, and overwrites them if the map disagrees. Embedded objects are different: each one needs its own _id and _type, which is what a Content Script writes.

Saves configured before this field existed used a Fields box and an Embedded Objects list. Those still work and are upgraded to Differences the next time the automation is saved.

A Save that updates fails—rather than reporting success—when a change targets no content actually present (a misspelled or stale id) or changes no stored value. A Save that creates always produces new content, with its id available to later steps in its output.

Output

The result returned by the connected CMS for the operation performed.

Content Script action

Runs a script that knows the connected CMS's content model, so it can build and edit content with named types and fields. Shown in the picker as Content Script, under Integration Actions. Requires a Brightspot connection.

Identical to the Script action apart from the connection—same sandbox, same context, same limits—but its script gets a dari object for working with content. See Content scripting for the API.

Fields

FieldRequiredDescription
ConnectionYesThe Brightspot connection whose content model the script reads. Nothing the script does with content types works until this is set.
LanguageYesThe script language and its source code.
DescriptionNoA note describing what the script does, for easy identification.
Output TypeNoThe shape of the value the script returns, so later steps can reference its fields.
Auto-generate Output TypeNoInfer the output type from the script's result on the last run, instead of declaring it by hand. Hidden once an output type is set. Not suited to a differences map, whose keys are record ids from that one run.

Script context

The same two values a Script step gets—payload for the preceding step's output and input for the values you mapped in—plus the dari object. The value the script returns becomes the step's output.

The plain Script action has no dari object; it is only available where a connection supplies a content model.

Output

If an output type is declared, the step exposes its fields. A value with no fields to expose—a scalar, a list, or an Object declared with no fields—is offered whole under payload. With no declared type, the output shape is unknown to later steps until the script runs.

A script that builds content typically ends with the differences map a Content action Save takes, which you then map into that step's Differences field. Declare that as an Object with no fields—its keys are record ids, so there is nothing to name—and it is offered under payload. See Returning a value.

Limits

The same ceilings as the Script action. Reading the content model costs one call to the connected CMS the first time a script names a type; the result is cached, so repeated runs do not pay it again.

Content Fetch action

Reads one piece of content from a Brightspot CMS—by content id, or by a field the type uses as a unique key.

FieldRequiredDescription
ConnectionYesThe Brightspot connection to read from.
Lookup FieldNoThe field to match on. Leave blank to fetch by content id; name an indexed unique field (slug, an external id) to fetch by that instead.
Lookup ValueYesThe value the lookup field must equal—a content id when Lookup Field is blank.
Content TypeNoRequired for any lookup field other than the content id. Optional when fetching by id, where it narrows the fetch—content of any other type reports as not found.

There is one addressing, not two: the content id is a field like any other, so fetching by id is this step with Lookup Field left blank. Only the content id is unique across every type, which is why anything else needs a Content Type to search within.

Output

found, plus contentId, contentTypeId, contentTypeName, label and contentValues when something matched. Nothing matched leaves those absent rather than empty, so check found first.

Finding nothing by field is a normal result, not a failure. The step completes with found set to false, so a later step can create what was missing. Fetching by id is different—an id names content that is supposed to be there, so nothing at it fails the step.

Matching more than one record fails. The field is being used as a key, and picking one of several would act on an arbitrary record. Use Content Query when you want every match rather than exactly one.

Why this is a separate step

Every Content action operation reports the content it acted on—a Save that created names what it created, just as one that updated names what it changed. A read by unique field cannot promise that: nothing matched is a legitimate answer with no content to name.

The Content action's own Fetch operation is still there, deprecated, reading by id only. A miss by id fails, so it never produces the outcome that motivated the split—which is why it can stay for the automations that already use it. Anything needing a natural key belongs here.

Upserting without a branch

  1. Content Fetch the Article whose slug is the one you have.
  2. A Content Script builds from payload.contentValues when payload.found, and from scratch when it doesn't.
  3. Content action → Save with a Content Type and Create If Missing, no target.

Content Query action

Resolves a query or a saved work stream to a list of content, to drive an automation across a set of items instead of a single event. Wire its results output into a Loop to process every match. Shown in the picker as Content Query, under Integration Actions. Requires a Brightspot connection.

Read-only, so a Content Query runs unchanged under a dry run—it always previews the real result set and count.

Fields

FieldRequiredDescription
ConnectionYesThe Brightspot connection to query.
SourceYesWhere the content list comes from—Custom Query or Work Stream (see below).

Sources

Custom Query builds the list from a content type and optional filters:

FieldRequiredDescription
SiteNoRestrict the query to one site. Defaults to the connection's site when it pins exactly one, otherwise every accessible site.
Content TypeYesThe type of content to query.
PredicateNoHow to narrow the type—Match Fields or Query Expression (see below). Leave unset to match every item of the type.
Max ResultsNoCaps how many items are returned and iterated. Defaults to 100; the CMS caps it at 1000.

Match Fields builds a predicate from field conditions in the editor:

  • Match—how to combine the conditions: All, Any, or None.
  • Conditions—a list of Condition clauses (Field, Operator, Value) and nested Groups, each with its own Match and conditions, so you can express a and (b or c). A condition's value accepts variables.

Query Expression is a raw query for filters the builder can't express—an operator outside the allowlist, or and/or/not combined with grouping:

FieldRequiredDescription
ExpressionYesA predicate expression using ? placeholders for values, e.g. headline contains ? and (cms.content.publishDate > ? or featured = ?). Supports and, or, not, parentheses, ?0/?1 positional binding, and keywords like missing.
ValuesNoValues substituted for the ? placeholders, in order. Each accepts variables. A note warns when the count doesn't match the expression's placeholders.

Work Stream runs across a saved, progress-tracked CMS work stream:

FieldRequiredDescription
Work StreamYesThe work stream to run across.
Include CompletedNoBy default only items not yet completed in the work stream are returned, so a re-run picks up where the last one left off. Turn on to return every item regardless of completion.
Max ResultsNoCaps how many items are returned and iterated. Defaults to 100; the CMS caps it at 1000.

Output

results—a list of matched content, each a summary with its id, type, and label. totalCount and truncated report the full match count and whether Max Results cut the list short. With a Work Stream source, the output also identifies the work stream, so a later step's Complete Work Stream Item operation can reference it.

Email action

Sends an email to one or more recipients. Shown in the picker as Email, under Notification Actions. Needs no connection; delivery is configured by an administrator.

Fields

FieldRequiredDescription
ToYesThe recipient email addresses. Accepts variables.
SubjectNoThe subject line. Accepts variables.
BodyNoThe message body, as rich text with basic formatting. Accepts variables.

Recipients who have opted out are skipped, and each message includes an unsubscribe link.

Output

FieldDescription
sentAddresses the message was sent to.
failedAddresses that failed, each with a reason.
skippedAddresses that were skipped (for example, opted out), each with a reason.

GitHub action

Runs one operation against a GitHub repository. Shown in the picker as GitHub, under Integration Actions. Requires a GitHub connection.

Fields

FieldRequiredDescription
ConnectionYesThe GitHub connection to use.
RepositoryYesThe repository to act on, as organization/repository.
OperationYesWhat to do (see below).

Operations

GroupOperations
Pull requestsCreate Pull Request, Get Pull Request, Update Pull Request, Merge Pull Request, Submit Pull Request Review, Add Reviewers.
IssuesCreate Issue, Get Issue, Update Issue.
Issues and pull requestsAdd Comment, Modify Assignees, Modify Labels.
BranchesCreate Branch, Get Branch, List Branches, Delete Branch.
Files and commitsGet File Contents, Create or Update File, Create Commit, Create Commit Status.
ReleasesCreate Release.
WorkflowsTrigger Workflow.

Each operation takes the inputs it needs—a pull request or issue number, a branch name, a file path and contents, and so on. Many text inputs accept variables.

Output

The result of the operation—for example, the created or fetched pull request, issue, branch, file, or commit. Some operations (such as merge or label changes) return no payload.

HTTP Request action

Sends an HTTP request to any URL. Shown in the picker as HTTP Request, under General Actions. Needs no connection.

Fields

FieldRequiredDescription
MethodYesThe HTTP method: GET, POST, PUT, PATCH, DELETE, HEAD, or OPTIONS.
URLYesThe request URL. Accepts variables.
Query ParametersNoName/value pairs appended to the URL; each can be enabled or disabled.
HeadersNoRequest headers; each can be enabled or disabled.
BodyNoThe request body. Available for methods that support one (POST, PUT, PATCH).
AuthNoOptional authentication applied to the request.
Follow RedirectsNoWhether to follow redirects. On by default.
Fail On Error StatusNoWhen on, a non-success status fails the step so the flow can follow its error path. Off by default.
Advanced
FieldDescription
Connect Timeout (ms), Read Timeout (ms)Per-request timeouts.
Response DestinationHow the response body is captured: Discard (status only), Headers Only, Inline (body in the payload), Storage (stream to storage), or Automatic (inline, spilling to storage if too large).
Inline Response: Max Size, Storage Response: Max SizeSize limits for the inline and storage tiers.
ResilienceOpt-in retry, timeout, and circuit-breaking for this step. Left unconfigured, a failure is terminal as before. Fields: Max Retries (0 disables), Initial Retry Delay, Backoff Multiplier, Max Retry Delay, and Jitter (randomize each delay by ±50% so many failing runs don't retry in lockstep); Attempt Timeout (fails a single attempt that runs too long, independent of retry); Enable Circuit Breaker with a Failure Threshold and Open Duration, so a struggling endpoint fails fast instead of being hammered once it has failed repeatedly. Retries are durable—a long backoff survives a restart—and each attempt is recorded, so the step's history shows every retry.
Dry Run: Outbound HTTPOverrides the site-wide policy for which methods this step sends during a dry runNone, Safe Methods Only, or All Methods. Leave unset to inherit the site setting.

Output

FieldDescription
status, statusTextThe HTTP status code and text.
headersResponse headers.
cookiesSet-Cookie values.
bodyThe raw body (inline and automatic modes).
jsonThe parsed body, when the response is JSON (inline and automatic modes).
storageItemA reference to the stored body (storage and automatic modes).

For safety, requests to private and loopback network addresses are blocked.

Jira action

Runs one operation against a Jira project. Shown in the picker as Jira, under Integration Actions. Requires a Jira connection.

Fields

FieldRequiredDescription
ConnectionYesThe Jira connection to use.
ProjectYesThe Jira project to act in.
OperationYesWhat to do (see below).

Operations

OperationKey inputs
Create IssueIssue type, summary, optional description, assignee, priority, labels, custom fields.
Get IssueIssue key.
Update IssueIssue key, plus the fields to change.
Assign IssueIssue key, assignee (blank to unassign).
Transition IssueIssue key, transition, optional comment.
Add CommentIssue key, comment body.
Search IssuesA JQL query, with optional paging and field selection.
Delete IssueIssue key; option to delete subtasks.
Add WorklogIssue key, time spent, optional comment and start time.
Link IssuesTwo issue keys, link type, optional comment.
Add WatcherIssue key, account.
Remove WatcherIssue key, account.

Output

The result of the operation—for most operations the affected issue or comment; for Search Issues, the matched issues with paging information.

Log action

Writes a message to the run's execution log, then continues. Shown in the picker as Log, under General Actions. Needs no connection.

Fields

FieldRequiredDescription
MessageNoThe line written to the execution log. Mix literal text with variables to record what a value holds at that point in the flow.
VariablesNoUpstream values recorded with the step for inspection, without being written into the message line. Use for complex objects, which read poorly inline—a variable in the message resolves to a flat string.

The message lands in the step's own execution log, never in the server log, so a Log step can stay in a live automation as a lightweight trace of what a value held—without the weight of a Script action.

Output

None. A Log step is transparent: it adds nothing of its own, and later steps keep referencing earlier outputs unchanged.

OpenAPI action

Calls an operation described by an OpenAPI specification. Shown in the picker as OpenAPI, under General Actions. Needs no connection of its own.

Fields

FieldRequiredDescription
Spec URLYesThe URL of the OpenAPI specification. Validated as you enter it.
OperationYesThe operation to call, chosen from the operations the spec defines.

Once you pick an operation, the action adds a field for each of that operation's path, query, and header parameters, and for its request-body properties. Many of these accept variables.

On the Advanced tab, Dry Run: Outbound HTTP overrides the site-wide policy for which methods this step sends during a dry runNone, Safe Methods Only, or All Methods. Leave unset to inherit the site setting.

Output

The operation's response, shaped by the response schema the specification defines for it.

Remote AI Agent action

Runs an AI agent through a connected Brightspot CMS—that CMS's own agent does the work with its tools. Shown in the picker as Remote AI Agent, under AI Actions. Supports human-in-the-loop.

Fields

FieldRequiredDescription
ConnectionYesThe Brightspot connection that runs the agent.
PersonaNoAn author persona from the connected CMS whose writing style the agent adopts.
PromptYesThe natural-language task for the agent. Accepts variables, so it can work on the trigger's data and earlier results.
Payload TypeNoAn output shape the agent populates as structured data, in addition to its message.
Human in the LoopNoOpt-in. Set it to let the agent pause and ask a person before finishing, and choose the Providers the question is pushed to (for example, Slack)—every request is also answerable from the AI Approvals inbox. Left unset, the agent must finish on its own.

The node's Display-tab Description, when left blank, falls back to the start of the prompt.

Human-in-the-loop

When Human in the Loop is set, the agent can pause to ask a person for input—a choice or free text. The step waits until the request is answered, then the agent resumes with the answer.

Output

FieldDescription
messageThe agent's text response.
payloadThe structured result, when a payload type is set.

Script action

Runs a script in a sandbox. Shown in the picker as Script, under General Actions. Needs no connection.

Fields

FieldRequiredDescription
LanguageYesThe script language and its source code.
DescriptionNoA note describing what the script does, for easy identification.
Output TypeNoThe shape of the value the script returns, so later steps can reference its fields.
Auto-generate Output TypeNoInfer the output type from the script's result on the last run, instead of declaring it by hand. Hidden once an output type is set.

Give the node a Display-tab Description for identification—see Building automations.

Script context

The script can read two values:

  • payload—the output of the preceding step. Not defined at all when the preceding step produced nothing, so a script that may run in that position checks typeof payload !== 'undefined' rather than payload?.field; optional chaining does not survive an undefined name.
  • input—the values you mapped into the step.

The value the script returns becomes the step's output.

Output

If an output type is declared, the step exposes its fields. A value with no fields to expose—a scalar, a list, or an Object declared with no fields—is offered whole under payload. With no declared type, the output shape is unknown to later steps until the script runs.

Limits

Scripts run in a sandbox with no access to the file system, the network, or the host. Several ceilings bound what one script may consume, because the server runs many scripts at once and none of them should be able to slow the others down. Script steps are intended for transforming data, and the defaults are set well above what that needs.

What is limitedDefault
Time to run3 seconds
CPU time used1 second
Statements executed1,000,000
Memory held at once32 MB
Memory allocated in total, including memory the script discards as it goes192 MB
Longest single string4,194,304 characters
Largest single typed array, such as a Uint8Array1,048,576 elements
Console output captured per run64 KB
Length of the script itself262,144 characters

For scale, a script that maps and filters a 50,000-item list and re-serializes it to JSON uses about 250,000 statements, under a tenth of a second, and under 4 MB of memory.

Cross a ceiling and the step fails with a message naming the one you crossed, so you can tell which value is in the way. Your administrator can change any of these. The two memory ceilings and the CPU ceiling depend on how the server is set up—an administrator can tell you which apply to your deployment—but the message you get always names the ceiling that stopped the script.

If you are hitting a limit, the usual fix is to move work out of the script rather than raise the ceiling: filter a list before the script rather than inside it, or split one large script into several steps.

Slack Message action

Posts a message to a Slack user or channel. Shown in the picker as Slack Message, under Notification Actions. Requires a Slack connection.

Fields

FieldRequiredDescription
ConnectionYesThe Slack connection to post through.
RecipientYesA user or channel to message. Accepts variables.
MessageNoThe message, as rich text with basic formatting. Accepts variables and is converted to Slack formatting.

Output

FieldDescription
recipientThe recipient the message was sent to.
channelSlack's resolved channel ID.
tsSlack's message timestamp, usable to thread replies.

Sleep action

Pauses the flow for a set duration, then continues. Shown in the picker as Sleep, under General Actions. Needs no connection.

Fields

FieldRequiredDescription
Sleep For (ms)YesHow long to pause, in milliseconds.

While paused, the run waits without consuming resources, then resumes and passes its incoming payload through unchanged.

Output

None.

note

A sleep longer than the automation's execution timeout is flagged in the editor.

Teams Message action

Posts a message to a Microsoft Teams channel over a connected bot. Shown in the picker as Teams Message, under Notification Actions. Requires a Microsoft Teams connection.

TODO screenshot

The Teams Message form—Connection, the cascading Team and Channel pickers, and a rich-text message with a variable chip.

Fields

FieldRequiredDescription
ConnectionYesThe Microsoft Teams connection to post through.
TeamYesThe team to post to, chosen from a picker. Limited to the connection's allowed teams when it curates a subset.
ChannelYesThe channel within the selected team, chosen from a cascading picker (standard channels only).
MessageNoThe message, as rich text limited to Teams-representable formatting (bold, italic, link, lists). Accepts variables and is converted to an Adaptive Card.
Test Recipient OverrideNoOn the Advanced tab. During a Dry Run, redirects the post to a test team/channel instead of the real destination.

Recipient selection is picker-only—you pick display names, never raw IDs. The pickers stay empty until the connection's administrator grants Microsoft Graph admin consent.

Output

FieldDescription
channelThe channel ID the message was posted to.
conversationIdThe Bot Framework conversation ID the message was posted to.
activityIdThe ID of the created message activity.

Stop with Error action

Deliberately fails the run when the flow reaches it. Shown in the picker as Stop with Error, under General Actions. Needs no connection.

Place it on a path that should never be taken—the false branch of a condition guarding an expected value—so an unexpected outcome becomes a visible failed run instead of a silent success.

Fields

FieldRequiredDescription
Error MessageNoThe message recorded on the failed run. Accepts variables, so it can include the unexpected value. Left blank, a standard message is recorded.

The failure is unhandled by design—it does not follow an error path—so reaching this node always fails the run.

Output

None. The node always fails, so later steps never read from it.

Conditions

Routing the flow. See Conditions and branching.

AI Judgment condition

Routes the flow based on an AI agent's answer to a yes/no question. Shown in the picker as AI Judgment, under General Conditions. Routes to true when the agent answers yes, otherwise to false.

Fields

FieldRequiredDescription
TemplateNoA reusable agent from the Agents catalog whose guidelines the judgment applies—for example, a brand-aware evaluator.
ContextNoFraming for the judgment—the criteria or background the AI should weigh, such as "On-brand means a positive tone, no politics, and lifestyle topics."
QuestionYesThe yes/no question that decides the route. Accepts variables, so it can ask about the trigger's data and earlier results.
MCP ServersNoTool sources the agent may call to inform its judgment—for example, a Brightspot environment, to check whether matching content already exists. Leave empty to judge from the question alone.

Deciding a route must not change anything, so the agent is only ever offered read-only tools—in a live run as well as a dry run. Mutating work belongs in an AI Agent action after the branch.

Output

The incoming payload, passed through unchanged on the chosen path. The agent's reasoning for its answer is written to the step's log, so the branch choice is explainable afterward.

Expression condition

Routes the flow based on a boolean expression you build. Shown in the picker as Expression, under General Conditions. Routes to true when the expression is true, otherwise to false.

Fields

FieldRequiredDescription
ExpressionYesThe boolean expression to evaluate, built from the comparisons and combinators below.

Comparisons

A comparison tests one or two values, each a variable or a literal.

OperatorTests whether…
Equals (==)The two values are equal.
Not Equals (!=)The two values differ.
Greater Than (>), Less Than (<)One number is greater / less than another.
Greater Or Equal (>=), Less Or Equal (<=)One number is at least / at most another.
ContainsThe first value contains the second.
Matches RegexThe value matches a regular expression.
Is Empty, Is Not EmptyA single value is empty / not empty.
Is Truthy, Is Not TruthyA single value is truthy / not truthy.

Combinators

CombinatorTrue when…
All OfEvery condition inside it is true (AND).
Any OfAny condition inside it is true (OR).
NotThe condition inside it is false.

Combinators can nest, so you can build expressions of any depth. The editor shows a readable preview as you build.

Output

The incoming payload, passed through unchanged on the chosen path.

Random (A/B Split) condition

Routes the flow randomly, by a percentage you set—useful for A/B tests. Shown in the picker as Random (A/B Split), under General Conditions.

Fields

FieldRequiredDescription
True PercentageYesThe percentage of runs that route to true (0–100). The rest route to false. Defaults to 50.

Output

The incoming payload, passed through unchanged on the chosen path.

Script condition

Routes the flow based on a script's result. Shown in the picker as Script, under General Conditions. Routes to true when the script returns a truthy value, otherwise to false.

Fields

FieldRequiredDescription
LanguageYesThe script language and its source code.

Script context

The script can read two values:

  • payload—the output of the preceding step.
  • input—the values you mapped into the step.

A returned value of null, false, zero, an empty string, or an empty collection routes to false; any other value routes to true.

Limits

The same sandbox and the same ceilings as the Script action.

Output

The incoming payload, passed through unchanged on the chosen path.

Loops

Repeating part of a flow. See Loops and iteration.

Loop

Opens a loop that repeats the body between it and its paired Loop End once for each item in a list. Shown in the picker as Loop, under Control. Adding a loop scaffolds the Loop and Loop End pair together.

Fields

FieldRequiredDescription
SourceYesThe list to iterate over, taken from an upstream variable that produces an array.
ModeYesWhether iterations run serially (one after another) or in parallel. Serial iterations can see the previous iteration's results; parallel iterations run independently.
Failure PolicyNoWhat happens when an item's body fails: fail fast stops the loop on the first failure; best effort records it and continues.

Output

Inside the loop body, the Loop node's output is the current item. Reference its fields to act on each item in turn.

Loop End

Closes a loop and converges its body. Shown in the picker as Loop End, under Control. It is paired with a Loop node and is normally added together with it.

Fields

FieldRequiredDescription
Collect Results FromNoGather one value from every iteration into the loop's results output—a body node's whole output, or one of its fields. Leave unset to emit only the run stats. To combine several body nodes, funnel them through one node first and collect that.

Output

A summary of the loop:

FieldDescription
countThe number of iterations.
successCountHow many iterations succeeded.
failedCountHow many iterations failed.
resultsPresent only when Collect Results From is set. One entry per iteration, in order, shaped as the collected value—skipping any iteration that didn't complete.

A later step can branch on count/successCount/failedCount to react to partial failures, or consume results as the whole set the loop processed—for example, feeding every iteration's output into a single downstream AI action.

Connections

Authenticated links to external systems. See Connections for how to create one.

Brightspot connection

Connects to a Brightspot CMS instance so the Content trigger and Content action can act on it. Shown in the picker as Brightspot. Authenticates with OAuth 2.0, configured automatically from the instance's base URL. The target CMS must have the Esca server module installed—an administrator task—before connecting works.

Fields

FieldRequiredDescription
Instance NameNoA memorable name for the instance.
Base URLYesThe base URL of the Brightspot instance. Normalized to scheme, host, and port on save.
Basic AuthUsername, PasswordNoHTTP Basic credentials for reaching a protected lower environment that sits behind a gateway. Separate from the OAuth sign-in below.

Authentication

Authentication uses OAuth 2.0. The connection discovers the instance's OAuth endpoints from the base URL and registers itself automatically—you do not enter client credentials. Click Connect and sign in to the target CMS to authorize access. Once connected, the connection shows the signed-in user's name and email.

Custom OAuth connection

Connects to any OAuth 2.0 service, for use with the HTTP request and OpenAPI actions. Shown in the picker as Custom OAuth.

Fields

FieldRequiredDescription
NameYesA name for the connection.
Auto-config InputNoPaste a discovery URL (RFC 8414 / RFC 9728) or an OpenAPI 3 oauth2 security-scheme fragment. On save, the connection fills in the endpoints, scopes, and—where the provider supports it—client credentials. Leave blank to configure the fields by hand.

Authentication

The embedded Custom OAuth 2.0 authentication exposes the full OAuth configuration, either filled in by auto-config or entered manually:

FieldRequiredDescription
Client IDYesThe OAuth client ID.
Client SecretNoThe client secret (omit for public clients).
Authorize URLYesThe provider's authorization endpoint.
Token URLYesThe provider's token endpoint.
Revoke URLNoThe revocation endpoint, if the provider offers one.
ScopesNoThe scopes to request.
Scope DelimiterNoHow scopes are joined. Defaults to a space.
Token Endpoint Auth MethodNoHow credentials are sent to the token endpoint. Defaults to HTTP Basic.
Refresh RotatesNoWhether the provider issues a new refresh token on every refresh.
ResourceNoAn RFC 8707 resource indicator, sent on authorize and token requests.
Use PKCENoUse PKCE (S256). On by default; required by OAuth 2.1. Disable only for legacy servers that reject it.
Extra Authorize Params, Extra Token ParamsNoAdditional provider-specific parameters.

After configuring, click Connect to authorize.

GitHub connection

Connects to GitHub so the GitHub trigger and GitHub action can use it. Shown in the picker as GitHub.

Fields

FieldRequiredDescription
NameYesA name for the connection.
AuthYesThe authentication method—Personal Access Token or App Installation.

Authentication

Personal Access Token
FieldRequiredDescription
TokenYesA GitHub personal access token.

Personal access tokens are tied to a user account and stop working if that account is deactivated.

App Installation
FieldRequiredDescription
App IDYesThe GitHub App's ID.
Installation IDYesThe installation ID for the organization the app is installed in.
Private Key (PEM)YesThe app's RSA private key in PKCS#8 PEM format.

An app installation is tied to an organization rather than a person, so it survives personnel changes—the right choice for a shared connection. If GitHub gives you a PKCS#1 key (beginning -----BEGIN RSA PRIVATE KEY-----), convert it to PKCS#8 first.

Both methods use stored credentials, so there is no connect-and-redirect step.

Jira connection

Connects to a Jira site so the Jira trigger and Jira action can use it. Shown in the picker as Jira.

Fields

FieldRequiredDescription
NameYesA name for the connection.
Site URLYesThe Jira site URL, for example https://your-org.atlassian.net.
AuthYesThe authentication method—API Token or OAuth 2.0 (3LO).

Authentication

API Token
FieldRequiredDescription
EmailYesThe email address of the Atlassian account that owns the API token.
API TokenYesA token generated at id.atlassian.com under Security → API tokens.

A service account is recommended over a personal account for production, so the connection does not break when a person's access changes.

OAuth 2.0 (3LO)
FieldRequiredDescription
Client IDYesThe client ID of your Atlassian OAuth 2.0 (3LO) app.
Client SecretYesThe app's client secret.

After entering the credentials, save and click Connect to authorize the app. OAuth is required for triggers that register their Jira webhooks automatically, because Atlassian limits the dynamic-webhook endpoint to OAuth apps.

note

The connection's authentication method and site URL cannot be changed while OAuth is connected or while registered webhooks exist.

Microsoft Teams connection

Connects to an Azure Bot / Entra application so the Teams Message action can post to Teams channels. Shown in the picker as Microsoft Teams. Bot-only—there is no webhook option.

TODO screenshot

The Microsoft Teams connection form—Name, the Auth cluster (Tenant ID, Client ID, Client Secret), and Allowed Teams—with the setup checklist, consent link, and app-package download note.

Fields

FieldRequiredDescription
NameYesA name for the connection.
AuthTenant IDYesThe Entra directory (tenant) ID.
AuthClient IDYesThe Entra application (client) ID. This is also the bot ID.
AuthClient SecretYesThe Entra client secret. Stored encrypted and never logged. Entra caps secret lifetime at 24 months—rotate before expiry.
Allowed TeamsNoThe teams this connection may target. Leave empty to allow any team in the tenant; when set, the action's team picker is limited to these teams. Populating it requires Graph admin consent.
Service URLNoOn the Advanced tab. The Bot Connector URL messages are sent through. Leave blank for the global Teams cloud.
Inbound IssuerNoOn the Advanced tab. The issuer inbound Teams replies must be signed by. Leave blank for the documented default.
Inbound JWKS URLNoOn the Advanced tab. Where Microsoft's signing keys are fetched from to verify inbound replies. Leave blank for the documented default.

The three Advanced fields exist for one case: a bot registered in a sovereign or government Microsoft cloud, which uses different endpoints from the public one. Leave all three blank otherwise—each connection resolves its own, so connections in different clouds can coexist. Changing the inbound two incorrectly stops Teams replies from being accepted while outbound posting keeps working.

Authentication

Credential-based—there is no Connect button. Enter the tenant ID, client ID, and client secret and save; the connection is usable immediately. The team and channel pickers additionally require an administrator to grant admin consent for two read-only Microsoft Graph permissions (Team.ReadBasic.All, Channel.ReadBasic.All), and the bot must be installed into each target team via the generated app package. For registering the app, granting consent, and installing the package, see Setting up the Microsoft Teams connection.

Answering approvals from a Teams card needs one further step—the Azure Bot's messaging endpoint must point at Esca. See Enable approvals in Teams.

Microsoft Teams human-in-the-loop provider

Presents an agent's human-in-the-loop question as an interactive card in a Teams channel, and updates that card in place once the request is answered. Selected on an agent action node, alongside any other providers you want notified. Shown in the picker as Microsoft Teams.

TODO screenshot

A Teams channel showing an interactive request card—question, agent context, schema-derived inputs, and a Submit button—next to the same card after resolution, reading "Answered by … at …".

Fields

FieldRequiredDescription
ConnectionYesThe Microsoft Teams connection to post through.
TeamYesThe team containing the target channel. Drawn from the connection's Allowed Teams when a subset is set, otherwise from every team in the tenant.
ChannelYesThe channel where the question is posted. Populated from the selected team's standard channels.

Recipient selection is picker-only, exactly as it is for the Teams Message action—you select display names and never type or paste a raw ID.

Behavior

The card opens with the automation's name and a one-line note that an automation has paused and needs input, followed by links to the automation and to the step that is waiting—so whoever receives it can see what asked, and go look, without hunting for it in Esca.

Below that is the agent's question. The card's inputs are generated from the shape of that question, so a yes/no confirmation, a choice among options, and a multi-field form each render appropriately. A field the card cannot represent faithfully falls back to a text box rather than being dropped.

Last in the card is a collapsible Details section holding the agent's most recent response—the summary it wrote just before pausing to ask. Click the row to expand it. Formatting in that summary, including lists, is preserved. Very long responses are clipped.

The agent's individual tool calls are not shown. The response is what explains the question, and tool arguments can contain content that does not belong in a channel.

When anyone answers—in Teams, in another channel, or from Esca's own pending-requests surface—the Teams card is replaced by a resolved version showing the answer and who gave it, so a stale card never keeps inviting a second submission.

Two behaviors worth knowing:

  • Progress is not streamed. Unlike Slack, the Teams card appears when the agent asks its question rather than updating live as the agent works. Teams has no streaming primitive for cards, and repeatedly rewriting one runs into platform rate limits. The Details section is therefore a snapshot taken at the moment the agent paused, not a live feed.
  • The links depend on the CMS having a configured default tool URL. Without one, the automation and step are still named on the card but are not clickable.
  • In a dry run, the card is posted to the channel from the automation's Teams test override if one is configured. With no override the Teams post is skipped entirely and the request is answered from within Esca—so a dry run never messages a real channel by accident.

If the Azure Bot's messaging endpoint is not configured, the card posts but its Submit button cannot reach Esca. See Enable approvals in Teams.

Slack connection

Connects to a Slack app so the Slack Message action can post messages and human-in-the-loop requests can be answered in Slack. Shown in the picker as Slack.

Fields

FieldRequiredDescription
App NameNoA memorable name for this Slack app. Falls back to the workspace name once connected.
AuthClient ID, Client SecretYesThe credentials of your Slack app, used for the OAuth install.
Signing SecretNoThe app's signing secret, used to verify Slack's interactive callbacks (such as approval button clicks). Found in the Slack app console under Basic Information → App Credentials.
Enable Channel ListNoEnables channel auto-complete in the recipient picker. Requires the app's channels:read scope to be approved.

Authentication

Enter the client ID and secret, save, then click Connect to install the app into your Slack workspace. Once installed, the connection can post as the app's bot. For creating and configuring the Slack app itself—scopes, redirect URL, and interactivity—see Setting up the Slack connection.

MCP servers

Tool sources for the AI Agent action and the AI Judgment condition, managed on the Connections page. See MCP servers for how to add one. Every server has a Name, which both labels it and identifies its tools to the agent.

Brightspot MCP server

The MCP endpoint of a Brightspot CMS. Shown in the picker as Brightspot. An MCP server is separate from a Brightspot connection—it authenticates against the CMS's MCP endpoint directly, matching how an administrator configured that endpoint.

Fields

FieldRequiredDescription
NameYesIdentifies the server and its tools to the agent.
MCP Endpoint URLYesThe full URL the CMS serves MCP at, for example https://cms.example.com/mcp.
AuthYesOAuth or API Key, matching how the endpoint is configured. The API key is sent as the X-API-Key header.

Authentication

With OAuth, everything is configured automatically: click Connect, sign in to the CMS, and authorize access—endpoints are discovered from the URL and a client is registered for you. With API Key, paste the key and save; there is no connect step.

Custom MCP server

Any remote MCP server, reached by URL. Shown in the picker as Custom. A Brightspot MCP endpoint can also be reached through this type, but the Brightspot server type is the first-class option.

Fields

FieldRequiredDescription
NameYesIdentifies the server and its tools to the agent.
Remote MCP Server URLYesThe URL the server is reached at.
Requires OAuthNoEnable when the server requires OAuth. Leave off for a public server—no credentials are sent.
Client IDNoShown when Requires OAuth is enabled. Leave blank to register a client dynamically at connect time; set it only when the server requires a pre-registered client.
Client SecretNoShown when Requires OAuth is enabled. The secret for the pre-registered client, if any.

Authentication

A public server needs nothing beyond its URL. For an OAuth server, enable Requires OAuth and click Connect—the OAuth endpoints are discovered from the URL, and unless you supplied a pre-registered client ID and secret, a client is registered dynamically as part of the flow.

Was this page helpful?

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.