These docs cover the S6S workflow engine — the developer playground layer underneath the product. For the main AI Visibility product (brand monitoring, the unified Report, fix actions), start at /docs/ai-visibility.

Node Types

Every workflow is a series of steps connected in a flow. Each step has an action type that determines what it does. This is the comprehensive reference for all built-in node types.

Triggers

Triggers define how a workflow starts. Every workflow needs exactly one trigger.

trigger.webhook

Start a workflow when an HTTP request hits a specific path.

ConfigTypeDefaultDescription
pathstring/my-webhookURL path (e.g. /new-lead)
methodstringPOSTHTTP method to accept
Output:{ body, headers, query, method, path, receivedAt }
Invoke URL: https://s6s.ai/api/webhooks/{path}?token={secret}
Access trigger data in your workflow steps:
  • {{trigger.output.body.*}}
  • {{trigger.output.headers.*}}
  • {{trigger.output.query.*}}
  • {{trigger.output.method}}

trigger.schedule

Run a workflow on a recurring schedule using cron expressions.

ConfigTypeDefaultDescription
cronExpressionstring0 * * * *Cron expression (minute, hour, day, month, weekday)
timezonestringUTCIANA timezone name
Output:{ scheduledTime, timezone }
Common cron patterns:
  • */5 * * * * — every 5 minutes
  • 0 9 * * 1-5 — weekdays at 9 AM
  • 0 0 * * * — daily at midnight
  • 0 0 1 * * — first of every month

trigger.manual

Start a workflow manually via the UI "Run" button or the POST /api/workflows/{id}/run API. No configuration needed.

Output:{ payload, triggeredAt, triggeredBy }

payload — the input object from the run request body (or {} if none)

triggeredAt — ISO timestamp

triggeredBy "api" or "ui"

Recipe format
{
  "trigger": { "type": "manual" }
}

Actions

Actions do work — call APIs, send messages, transform data, run code.

action.http

Make an HTTP request to any URL.

ConfigTypeDefaultDescription
urlstringFull URL
methodstringGETHTTP method
headersobject{}Request headers
bodystringRequest body (for POST/PUT/PATCH)
Output:{ status, headers, body }

Supports expression templates in all fields: {{steps.prev.output.url}}

action.transform

Reshape data between steps using a JSON template with expressions.

ConfigTypeDefaultDescription
templateobject{}JSON template with {{expression}} placeholders

Output: The evaluated template object.

Example
{
  "template": {
    "message": "Hello, {{trigger.output.body.name}}!",
    "timestamp": "{{trigger.output.timestamp}}"
  }
}

action.code

Execute a JavaScript expression and return the result.

ConfigTypeDefaultDescription
expressionstring({ result: 'hello' })JavaScript expression to evaluate
languagestringjavascriptLanguage (currently only javascript)

Output: The return value of the expression.

action.email

Send an email via SMTP.

ConfigTypeDefaultDescription
tostringRecipient email
subjectstringEmail subject
bodyTemplatestringEmail body (supports expressions)

Requires credential: smtp

action.slack

Post a message to a Slack channel.

ConfigTypeDefaultDescription
channelstring#generalChannel name or ID
textTemplatestringMessage text (supports expressions)

Requires credential: slack

action.discord

Send a message or perform an action in Discord.

ConfigTypeDefaultDescription
actionstringsend_messagesend_message, send_embed, add_reaction
channelIdstringDiscord channel ID
contentstringMessage content

Requires credential: discord

action.telegram

Send a message or perform an action in Telegram.

ConfigTypeDefaultDescription
actionstringsend_messagesend_message, send_photo, send_document
chatIdstringTelegram chat ID
textstringMessage text

Requires credential: telegram

Auto-chunking: Messages longer than 4096 characters are automatically split at newline boundaries and sent as multiple messages.

action.imap

Fetch, search, or read mailbox content over IMAP.

ConfigTypeDefaultDescription
actionstringfetch_recentfetch_recent, search, read_message
querystringSearch query for search mode
messageIdstringMessage identifier for read_message mode
maxResultsnumber20Maximum messages to return
sincestringRelative time filter like 1h or 7d
folderstringINBOXMailbox folder
markAsReadbooleanfalseMark fetched messages as read

Requires credential: imap

action.rss

Fetch and parse an RSS feed.

ConfigTypeDefaultDescription
feedUrlstringRSS feed URL
maxItemsnumber10Maximum items to return
Output:{ items: [{ title, link, description, pubDate }] }

action.twitter

Post a tweet or interact with the Twitter API.

ConfigTypeDefaultDescription
actionstringpost_tweetpost_tweet, search, get_user
textstringTweet content

Requires credential: twitter

action.google_sheets

Read from or write to Google Sheets.

ConfigTypeDefaultDescription
actionstringread_rowsread_rows, append_row, update_cell
spreadsheetIdstringSpreadsheet ID from the URL
rangestringSheet1!A:ZCell range

Requires credential: google

action.google_drive

List, upload, or download files from Google Drive.

ConfigTypeDefaultDescription
actionstringlistlist, upload, download, create_folder
maxResultsnumber10Max files to return

Requires credential: google

action.gmail

Search, read, or send email via the Gmail API.

ConfigTypeDefaultDescription
actionstringsearch_messagessearch_messages, read_message, send_message
querystringGmail search query (for search_messages)
messageIdstringMessage ID (for read_message)
maxResultsnumber10Max results for search
tostringRecipient (for send_message)
subjectstringEmail subject (for send_message)
bodystringEmail body (for send_message)

Requires credential: google

action.database

Execute a SQL query against a connected database.

ConfigTypeDefaultDescription
querystringSQL query
operationstringselectselect, insert, update, delete

Requires credential: database

action.filter

Filter or transform arrays.

ConfigTypeDefaultDescription
arrayExpressionstringExpression that resolves to an array
conditionstringtrueFilter condition
modestringfilterfilter or map

action.ai

Send a prompt to an LLM and get a response.

ConfigTypeDefaultDescription
promptstringThe prompt (supports expressions)
responseFormatstringtexttext or json

action.buffer

Full Buffer publishing pipeline: create/edit/delete posts, view queue & sent history, and publish immediately across X, Instagram, TikTok, and more.

ConfigTypeDefaultDescription
actionstringcreate_postcreate_post, list_channels, get_queue, get_sent, share_now, delete_post, update_post
textstringPost text (create_post, update_post)
mediaUrlstringURL of media to attach
channelIdsarray[]Buffer channel IDs to publish to (create_post)
scheduledAtstringISO timestamp to schedule the post
shortenbooleantrueShorten links in post text
profileIdstringProfile/channel ID (get_queue, get_sent)
updateIdstringBuffer update ID (share_now, delete_post, update_post)
countnumber20Results per page (get_queue, get_sent)
pagenumberPage number for pagination
sincestringUnix timestamp — only return updates after this time

Requires credential: buffer

action.webhook_response

Return a custom HTTP response to the webhook caller.

ConfigTypeDefaultDescription
statusCodenumber200HTTP status code
bodystringResponse body

action.execute_workflow

Trigger another S6S workflow by slug.

ConfigTypeDefaultDescription
slugstringTarget workflow slug
waitForCompletionbooleantrueWait for the child workflow to finish

action.stop_and_error

Immediately stop the workflow and report an error. Useful for guardrails.

ConfigTypeDefaultDescription
messagestringWorkflow stoppedError message surfaced in the run summary

action.youtube

Upload videos, list channel videos, get video details, and update video metadata via the YouTube Data API.

ConfigTypeDefaultDescription
actionstringlist_videosupload_video, list_videos, get_video, update_video
videoUrlstringURL of the video to upload
titlestringVideo title
descriptionstringVideo description
tagsarray[]Video tags for discovery
privacyStatusstringprivatepublic, unlisted, or private
categoryIdstringYouTube video category ID
videoIdstringVideo ID (for get_video / update_video)
maxResultsnumber10Max videos to return (for list_videos)

Requires credential: google

Logic

Logic nodes control execution flow — branching, looping, timing, and parallelism.

logic.condition

Branch execution based on a condition. Has two output handles: true (green) and false (red).

ConfigTypeDefaultDescription
expressionstringLeft-hand value (supports expressions)
operatorstringeqComparison operator (see below)
valuestringRight-hand value
Operators:
eqneqgtgteltltecontainsexistsnot_existsmatchesin

logic.switch

Route to different branches based on an expression's value.

ConfigTypeDefaultDescription
expressionstringValue to switch on
casesarray[][{ value, target }] case definitions
defaultTargetstringFallback target if no case matches

logic.loop

Iterate over an array, executing downstream nodes for each item.

ConfigTypeDefaultDescription
arrayExpressionstringExpression resolving to an array
itemVariablestringitemVariable name for current item
maxIterationsnumber100Safety limit to prevent infinite loops

logic.wait

Pause execution for a specified duration.

ConfigTypeDefaultDescription
secondsnumber60Wait time in seconds

logic.merge

Combine outputs from parallel branches into a single object. Place after parallel groups in the flow array.

ConfigTypeDefaultDescription
modestringwait_allMerge strategy (currently wait_all)
Output:{ branch_a: {...}, branch_b: {...} }
Recipe example
{
  "flow": [
    "fetch_data",
    ["branch_a", "branch_b"],
    "combine",
    "send_result"
  ]
}

// "combine" is a merge step — it waits for both
// parallel branches and merges their outputs.

Conditional Execution

Any node can include a run_if expression in its config. When present, the engine evaluates it at runtime: truthy executes the node normally, falsy skips it with status skipped. Skipped nodes do not fail the run.

run_if example
{
  "ref": "send_alert",
  "action": "telegram",
  "config": {
    "action": "send_message",
    "chatId": "123456",
    "text": "Alert: threshold exceeded",
    "run_if": "{{steps.check.output.amount > 1000}}"
  }
}

Dynamic Integrations

Beyond the built-in action types, S6S supports a provider.action syntax for any API integration. Use this to connect to services like Notion, Pinterest, HubSpot, or any other API — S6S learns the API automatically.

ActionDescription
notion.create_pageCreate a page in Notion
pinterest.create_pinCreate a pin on Pinterest
hubspot.create_contactCreate a contact in HubSpot
stripe.create_invoiceCreate a Stripe invoice

S6S resolves the provider and action, fetches the API schema, and handles authentication, pagination, and error retries. Learn more about dynamic integrations.

Expressions

Use {{expression}} syntax in any config field to reference data from previous steps:

ExpressionDescription
{{trigger.output.body.name}}Webhook request body field
{{steps.format.output.message}}A previous step's output by ref name
{{steps.fetch.output.body.items[0]}}Nested array access
{{run.id}}Current run ID

Expressions are evaluated at runtime with full access to the workflow execution context.

Need help choosing node types?

Describe what you want to automate in the chat UI and S6S will generate the right workflow for you.