v1.0.0
Reference

Node Directory

Explore the complete registry of deterministic operations and AI integration blocks available in the execution engine.

Triggers

4 Nodes

Manual Trigger

FREE

Starts a workflow instantly when the user clicks the Run button in the UI.

Purpose

Use this as the starting node for any workflow you want to run on-demand at any time.

Example Flow
Manual → Keyword Explorer → AI Writer → WP Draft
Configuration Fields

No configuration fields required.

Reads Upstream State

Does not consume upstream data.

Outputs Downstream State
  • triggered_by"manual"
    Always the string "manual"
  • timestampISO date string
    When the run was triggered

Schedule Trigger

FREE

Starts a workflow automatically on a repeating cron schedule (e.g. every Monday at 9am).

Purpose

Use this when you want a workflow to run automatically at a fixed interval, like a daily or weekly content pipeline.

Example Flow
Schedule → Keyword Explorer → AI Writer → WP Draft (runs weekly automatically)
Configuration Fields
cronExpression*REQUIRED
A cron expression, e.g. "0 9 * * 1" for every Monday at 9am
Reads Upstream State

Does not consume upstream data.

Outputs Downstream State
  • triggered_by"schedule"
    Always the string "schedule"
  • cron_configobject
    The cron configuration object
  • timestampISO date string
    When the schedule fired

Watchdog Trigger

FREE

Starts a workflow when an external service sends a webhook (e.g. an alert from Ahrefs, Semrush, or a custom integration).

Purpose

Use this as a reactive trigger — the workflow only fires when something external happens, like a ranking drop or traffic anomaly.

Example Flow
Watchdog → AI Analyst → Slack Message (notifies team when a ranking alert fires)
Configuration Fields

No configuration fields required.

Reads Upstream State

Does not consume upstream data.

Outputs Downstream State
  • triggered_by"watchdog"
    Always the string "watchdog"
  • webhook_dataobject
    The raw payload from the external service
  • timestampISO date string
    When the webhook was received

Slack Channel

FREE

Starts a workflow whenever a new message is posted in a monitored Slack channel. Uses the Slack Events API to receive real-time message notifications.

Purpose

Use this as an event-driven trigger — the workflow fires automatically whenever someone posts in your #seo-requests or #alerts channel. The message text is available for downstream AI nodes.

Example Flow
Slack Channel (#seo-requests) → AI Analyst (analyzes the message) → Slack Message (sends results back)
Configuration Fields
channelId*REQUIRED
The Slack channel ID to monitor (e.g. "C0123456789"). Find it in Slack: right-click channel → View channel details → bottom of About tab.
channelName
Human-readable channel name for display only (e.g. "#seo-requests")
Reads Upstream State

Does not consume upstream data.

Outputs Downstream State
  • triggered_by"slack_channel"
    Always the string "slack_channel"
  • slack_message_textString
    The full text of the Slack message that triggered the workflow
  • slack_channelString
    The Slack channel ID (e.g. "C0123456789") where the message was posted
  • slack_userString
    The Slack user ID of the person who sent the message
  • slack_tsString
    The Slack message timestamp (unique message ID)
  • timestampISO date string
    When the trigger fired

Data

7 Nodes

SERP Competitors

5 CR

Analyzes target keywords to find top organic competitor domains and their visibility metrics across the search results.

Purpose

Use this to discover which domains are dominating the SERPs for a given set of seed keywords. Feed it keywords from Keyword Explorer, or a single keyword string. Useful for gap analysis.

Example Flow
Keyword Explorer → SERP Competitors → AI Analyst (analyze competitor visibility) → Slack Message
Configuration Fields
keyword
Seed keyword (used if upstream keyword_data array is missing)
country
Two-letter country code (default: "us")
limit
Max domains to return (default: 10)
Reads Upstream State
  • keyword_dataConsumes an array of keywords if provided by Keyword Explorer (uses up to first 200)
  • analyst_outputsArray of keyword strings from AI Analyst in json_array mode — used directly as keyword list
  • analyst_outputSingle text output from AI Analyst — used as a single keyword fallback
  • keywordFallback single keyword if keyword_data array is not present
  • slack_message_textFallback from Slack trigger
  • search_results.organic[0].titleFallback single keyword from Google Search results
Outputs Downstream State
  • competitor_dataArray of domain objects
    Contains objects with: domain, avg_position, median_position, rating, etv (estimated traffic), keywords_count, visibility

Keyword Explorer

5 CR

Fetches SEO keyword research data for a seed keyword using the DataForSEO API. Returns a ranked list of related keywords with search volume, CPC, and organic ranking difficulty.

Purpose

Use this when you need keyword data to feed into an AI Analyst or AI Writer. It is the primary data-gathering node for content workflows.

Example Flow
Manual → Keyword Explorer (keyword: "email marketing") → AI Analyst → AI Writer → WP Draft
Configuration Fields
keyword
The seed keyword to research. If omitted, uses upstream state.
country
Two-letter country code (default: "us")
limit
Number of keywords to return (default: 10). Every 10 results costs 1× the base credit price.
Reads Upstream State
  • previous_output.keywordCan pick up a keyword from an earlier node if config.keyword is not set
Outputs Downstream State
  • keyword_dataArray of keyword objects
    Each object has: text (keyword string), vol (monthly search volume), cpc (cost per click), competition (numeric organic Ranking Difficulty 0-100), score ("Low", "Medium", or "High" indicator of Google Ads competition)

Site Auditor

5 CR

Runs a full SEO audit on a website URL using the DataForSEO OnPage API. Returns technical SEO issues, title/meta suggestions, and core web vitals information.

Purpose

Use this to assess the health of a website before running AI analysis or sending a report. Best paired with AI Analyst for actionable insights.

Example Flow
Manual → Site Auditor (url: "https://myblog.com") → AI Analyst → Slack Message
Configuration Fields
url
The website URL to audit (e.g. "https://example.com"). If omitted, uses upstream state.
Reads Upstream State
  • previous_output.urlCan pick up a URL from an earlier node if config.url is not set
Outputs Downstream State
  • audit_dataObject
    Contains: url (audited site), basic (domain info), webtitle.suggestion, metadescription.suggestion, htags, metrics (word count, load time, readability), links (counts), issues[] (list of detected SEO problems)

Website Speed Check

5 CR

Runs a speed test and performance check on a website URL using the DataForSEO OnPage API. Returns metrics such as load time, page size, TTFB, and suggestions for improvement.

Purpose

Use this to analyze a website's loading speed performance and identify technical bottlenecks before sending an audit report.

Example Flow
Manual → Website Speed Check (url: "https://myblog.com") → AI Analyst → Slack Message
Configuration Fields
url
The website URL to test (e.g. "https://example.com"). If omitted, uses upstream state.
Reads Upstream State
  • previous_output.urlCan pick up a URL from an earlier node if config.url is not set
Outputs Downstream State
  • speed_dataObject
    Contains: summary (overall score, load time, sizes, requests), metrics (TTFB, FCP, LCP, interactive), improve_page_performance (list of actionable optimization suggestions).

Google Search

2 CR

Fetches the top Google search results for a given query using the Serper.dev API.

Purpose

Use this to perform live Google searches for competitor analysis, trend discovery, or factual verification before writing content.

Example Flow
Manual → Google Search (q: "latest SEO trends") → AI Analyst → AI Writer
Configuration Fields
q
The search query. If omitted, auto-resolved from keyword_data[0].text, keyword, or slack_message_text upstream.
gl
Two-letter country code (default: "us")
hl
Language code (default: "en")
tbs
Date range filter (e.g., "Any time", "Past 24hours", "Past month")
Reads Upstream State
  • keyword_data[0].textCan pick up a keyword from Keyword Explorer if config.q is not set
  • keywordFallback keyword
  • slack_message_textFallback from Slack trigger
Outputs Downstream State
  • search_resultsObject
    Contains an array of top 10 organic search results and related searches.

Top Search Keywords

5 CR

Fetches the top organic search keywords that a specific domain ranks for using the DataForSEO Labs API.

Purpose

Use this to perform competitor analysis or discover which keywords are already driving traffic to a website.

Example Flow
Manual → Top Search Keywords (website: "competitor.com") → AI Analyst → Slack Message
Configuration Fields
website
The domain to analyze (e.g., example.com). If omitted, uses upstream url.
limit
Number of top search keywords to return (default: 10)
Reads Upstream State
  • audit_data.urlURL from Site Auditor output
  • speed_data.summary.urlURL from Website Speed Check output
  • urlFlat url key in state
  • slack_message_textFallback from Slack trigger
  • siteFlat site key in state
  • domainFlat domain key in state
Outputs Downstream State
  • top_keywordsArray of keyword objects
    Contains ranked keywords with search volume, organic ranking difficulty (0-100), and estimated clicks.

Page Content

5 CR

Extracts the text content of any web page using the DataForSEO OnPage API. Returns the page as Markdown plus structured metadata like headings, main topic, and word count.

Purpose

Use this to fetch the actual text of a competitor page, landing page, or article before feeding it to an AI Analyst for content analysis, gap analysis, or a rewrite brief.

Example Flow
Manual → Page Content (url: "https://competitor.com/blog/article") → AI Analyst → Slack Message
Configuration Fields
url
The page URL to extract content from. If omitted, uses upstream state.
enableJavascript
Enable JavaScript rendering for SPA/dynamic pages (default: false). Increases API cost.
Reads Upstream State
  • urlURL from upstream state or Site Auditor / Speed Check
  • audit_data.urlURL from Site Auditor output
  • speed_data.summary.urlURL from Website Speed Check output
Outputs Downstream State
  • page_content_dataObject
    Contains: url, markdown (full page as Markdown string), main_topic, word_count, language, headings[]

Datasets

1 Nodes

CSV Import

FREE

Import data from a CSV file uploaded by the user. Parses headers and rows into a structured object for downstream processing.

Purpose

Use this to load tabular data from a CSV file. The parsed rows & headers are available in state for AI Analyst, AI Writer, or any downstream node.

Example Flow
Manual → CSV Import → AI Analyst (analyze tabular data) → Slack Message
Configuration Fields
csvContent
Raw CSV string (set automatically by the file upload UI)
fileName
Original file name (set automatically)
Reads Upstream State

Does not consume upstream data.

Outputs Downstream State
  • csv_dataObject
    Contains { headers: string[], rows: object[], row_count: number, file_name: string }

Agents

2 Nodes

AI Analyst

2 CR

Sends the current workflow state (including keyword_data or audit_data) to a large language model and returns a structured analysis with actionable SEO recommendations. If followed directly by an AI Writer, it automatically generates a structured writing brief.

Purpose

Use this as a reasoning step after gathering data. It interprets raw keyword or audit data and produces a human-readable analysis that can guide the AI Writer or be sent to Slack.

Example Flow
Keyword Explorer → AI Analyst → AI Writer (Analyst auto-generates a structured article outline for the writer)
Configuration Fields
systemPrompt
Custom instruction to the LLM (default: "Analyze the following SEO data and provide actionable recommendations")
outputFormat
"text" (default) or "json_array" for branching to multiple nodes
__nextNodeTypes
Read-only: Injected by the runner to provide downstream awareness (e.g. auto-generating writing briefs for AI Writer)
Reads Upstream State
  • keyword_dataKeyword list from Keyword Explorer
  • top_keywordsTop ranking keywords from Top Search Keywords
  • competitor_dataSERP competitor list from SERP Competitors
  • audit_dataAudit results from Site Auditor
  • speed_dataSpeed metrics from Website Speed Check
  • search_resultsOrganic search results from Google Search
  • slack_message_textSlack trigger message context
  • webhook_dataWatchdog incoming webhook payload
  • page_content_dataExtracted markdown and headings from Page Content
  • (entire state)Fallback: Passes the entire state to the LLM
Outputs Downstream State
  • analyst_outputString
    The LLM's analysis text with SEO recommendations (or a structured brief if followed by AI Writer)
  • analyst_outputsArray of strings
    If outputFormat is "json_array", this will be the parsed array of strings.
  • analyst_outputs_countNumber
    If outputFormat is "json_array", this will be the number of items in the array.

AI Writer

3 CR

Generates a full, publish-ready SEO blog post in markdown format. Uses the upstream keyword data and analyst output as context. The article starts with an H1 title and contains no placeholders. When connected to a CSV Import node it enters CSV Batch Mode and generates one article per CSV row, charging credits for each.

Purpose

Use this to generate actual blog post content. It reads from AI Analyst output as an outline, and from Keyword Explorer for the topic. Connect a CSV Import node upstream to batch-generate one article per row (e.g. a CSV of article titles). The output feeds directly into WP Draft.

Example Flow
CSV Import (titles.csv) → AI Writer (csvTopicColumn: "title") → WP Draft (generates one draft per row)
Configuration Fields
topic
Override the article topic (leave blank to auto-use upstream keyword_data; DO NOT enter conversational text)
outline
Override the article outline/context (leave blank to auto-use analyst_output; DO NOT enter conversational text)
analystOutputIndex
If reading a branched array from AI Analyst, which index to pick
writingInstructions
Supplementary writing guidance appended to the AI prompt (e.g., "Write in a casual tone, target beginners, include examples"). Only set if the user explicitly provides tone/style/audience guidance.
csvTopicColumn
CSV Batch Mode: the CSV header name whose value is used as the article topic for each row (e.g. "title"). Defaults to the first column if not set.
csvOutlineColumn
CSV Batch Mode: optional CSV header name whose value is used as the article outline/context for each row. If not set, falls back to analyst_output.
Reads Upstream State
  • csv_dataCSV Batch Mode: when csv_data is present the writer generates one article per row. Each row's topic column value becomes the article topic.
  • keyword_data[0].textThe primary keyword used as the article topic if config.topic is not set
  • top_keywords[0].keywordThe primary competitor keyword used as topic if coming from Top Search Keywords
  • keywordFallback topic
  • slack_message_textFallback topic from Slack trigger
  • search_results.organic[0].titleFallback topic from Google Search
  • analyst_outputUsed as the outline/context if config.outline is not set (also used as shared outline in CSV Batch Mode when csvOutlineColumn is not set)
  • analyst_outputs[index]Used as topic and outline if config.analystOutputIndex is set (array branching)
Outputs Downstream State
  • draft_contentString or Array of Strings
    The generated markdown blog post(s). In CSV Batch Mode this is always an array with one entry per row.
  • csv_articles_countNumber
    In CSV Batch Mode: how many articles were successfully generated.

Actions

5 Nodes

WP Draft

1 CR

Publishes one or more markdown articles as WordPress draft posts using the WordPress REST API. Automatically converts markdown to HTML, extracts the H1 as the post title, and creates the draft in your WordPress admin.

Purpose

Use this as the final publishing step in content generation workflows. Connects to your WordPress site using Application Passwords. Costs 1 credit per article published. Note: When gathering from multiple AI Writers, place them serially (Writer 1 → Writer 2) rather than in parallel to avoid draft overwrites.

Example Flow
AI Writer → WP Draft (integrationId: "<your-wp-integration-id>")
Configuration Fields
integrationId*REQUIRED
UUID of the saved WordPress integration (set up in the Integrations dashboard)
title
Fallback title if no H1 is detected in the content
content
Static fallback content to publish if draft_content is not in state (rarely needed — prefer AI Writer output).
siteUrl
(Legacy) Your WordPress site URL — use an integration instead.
username
(Legacy) Your WordPress username — use an integration instead.
appPassword
(Legacy) WordPress Application Password — use an integration instead.
Reads Upstream State
  • draft_contentThe markdown article(s) from AI Writer. Can be a single string or an array for batch publishing.
  • keyword_data[0].textUsed as fallback post title if no H1 found in content
  • top_keywords[0].keywordSecondary fallback post title from Top Search Keywords
Outputs Downstream State
  • wp_draft_urlString
    WordPress admin edit URL of the created draft (single post)
  • wp_post_idNumber
    WordPress post ID (single post)
  • wp_draft_urlsArray of strings
    Admin edit URLs for all created drafts (batch)
  • wp_post_idsArray of numbers
    WordPress post IDs for all created drafts (batch)
  • wp_status"draft_created"
    Confirmation that the draft was created successfully
  • wp_posts_countNumber
    How many drafts were created

Slack Message

1 CR

Sends a message to a Slack workspace using a saved Slack integration. Supports {{variable}} placeholders that are substituted with values from the workflow state (e.g. {{wp_draft_url}}).

Purpose

Use this to notify your team when a workflow completes, a draft is ready, or an alert fires. Best placed at the end of a workflow or after a Site Auditor as a reporting step.

Example Flow
WP Draft → Slack Message (message: "New draft ready: {{wp_draft_url}}")
Configuration Fields
integrationId*REQUIRED
The UUID of the saved Slack integration (set up in the Integrations dashboard)
message
The message text. Supports {{variable}} placeholders. Default: "Workflow completed! Draft: {{wp_draft_url}}"
Reads Upstream State
  • (any upstream state key)Any key in the state can be referenced in the message using {{keyName}} syntax
Outputs Downstream State
  • slack_status"message_sent"
    Confirmation that the Slack message was delivered

Monday: Create Item

1 CR

Creates a new item in a Monday.com board when a workflow runs.

Purpose

Use at the end of a content workflow to track deliverables in Monday. The item name is pulled from upstream state (keyword, draft title, etc.).

Example Flow
AI Writer → Monday: Create Item (tracks the new article as a task)
Configuration Fields
integrationId*REQUIRED
UUID of the saved Monday integration
itemName
Override the item name. Supports {{variable}} placeholders.
Reads Upstream State
  • draft_contentUsed to derive the item name from the article H1
  • keyword_dataUsed as fallback item name
Outputs Downstream State
  • monday_item_idNumber
    The ID of the created Monday item
  • monday_item_urlString
    Direct URL to the Monday item
  • monday_status"item_created"
    Confirmation string

Telegram Message

1 CR

Sends a message to a Telegram chat or channel using a saved Telegram integration. Supports {{variable}} placeholders.

Purpose

Use this to notify your team when a workflow completes. Best placed at the end of a workflow.

Example Flow
WP Draft → Telegram Message (message: "New draft ready: {{wp_draft_url}}")
Configuration Fields
integrationId*REQUIRED
The UUID of the saved Telegram integration
message
The message text. Supports {{variable}} placeholders.
Reads Upstream State
  • (any upstream state key)Any key in the state can be referenced in the message using {{keyName}} syntax
Outputs Downstream State
  • telegram_status"message_sent"
    Confirmation that the Telegram message was delivered

Export Markdown

2 CR

Collects all upstream workflow data (articles, analyses, keyword data, audit results, etc.) and uses AI to produce a polished, well-structured Markdown document that the user can download after the flow finishes.

Purpose

Use this as a final node when you want a downloadable Markdown report of everything the workflow produced. It intelligently formats raw data into tables, lists, and readable sections.

Example Flow
AI Analyst → Export Markdown (downloads a formatted SEO report)
Configuration Fields
title
Custom document title. Supports {{variable}} placeholders. If omitted, AI infers a title.
instructions
Extra formatting instructions for the AI (e.g. "Focus on actionable recommendations", "Use a formal tone").
Reads Upstream State
  • draft_contentArticle content from AI Writer
  • analyst_outputAnalysis text from AI Analyst
  • keyword_dataKeyword research data from Keyword Explorer
  • top_keywordsTop ranking keywords from Top Search Keywords
  • search_resultsOrganic search results from Google Search
  • audit_dataAudit results from Site Auditor
  • speed_dataSpeed metrics from Website Speed Check
  • competitor_dataSERP competitor list from SERP Competitors
  • page_content_dataExtracted content from Page Content
  • wp_draft_urlWordPress draft URL from WP Draft
Outputs Downstream State
  • export_markdownString
    The generated Markdown document content
  • export_filenameString
    Suggested filename for the download (e.g. "seo-report-1709942400000.md")
  • export_status"ready"
    Confirmation that the export is ready for download