Node Directory
Explore the complete registry of deterministic operations and AI integration blocks available in the execution engine.
Triggers
4 NodesManual Trigger
FREEStarts a workflow instantly when the user clicks the Run button in the UI.
Use this as the starting node for any workflow you want to run on-demand at any time.
No configuration fields required.
Does not consume upstream data.
- triggered_by"manual"Always the string "manual"
- timestampISO date stringWhen the run was triggered
Schedule Trigger
FREEStarts a workflow automatically on a repeating cron schedule (e.g. every Monday at 9am).
Use this when you want a workflow to run automatically at a fixed interval, like a daily or weekly content pipeline.
cronExpression*REQUIREDDoes not consume upstream data.
- triggered_by"schedule"Always the string "schedule"
- cron_configobjectThe cron configuration object
- timestampISO date stringWhen the schedule fired
Watchdog Trigger
FREEStarts a workflow when an external service sends a webhook (e.g. an alert from Ahrefs, Semrush, or a custom integration).
Use this as a reactive trigger — the workflow only fires when something external happens, like a ranking drop or traffic anomaly.
No configuration fields required.
Does not consume upstream data.
- triggered_by"watchdog"Always the string "watchdog"
- webhook_dataobjectThe raw payload from the external service
- timestampISO date stringWhen the webhook was received
Slack Channel
FREEStarts a workflow whenever a new message is posted in a monitored Slack channel. Uses the Slack Events API to receive real-time message notifications.
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.
channelId*REQUIREDchannelNameDoes not consume upstream data.
- triggered_by"slack_channel"Always the string "slack_channel"
- slack_message_textStringThe full text of the Slack message that triggered the workflow
- slack_channelStringThe Slack channel ID (e.g. "C0123456789") where the message was posted
- slack_userStringThe Slack user ID of the person who sent the message
- slack_tsStringThe Slack message timestamp (unique message ID)
- timestampISO date stringWhen the trigger fired
Data
7 NodesSERP Competitors
5 CRAnalyzes target keywords to find top organic competitor domains and their visibility metrics across the search results.
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.
keywordcountrylimit- 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
- competitor_dataArray of domain objectsContains objects with: domain, avg_position, median_position, rating, etv (estimated traffic), keywords_count, visibility
Keyword Explorer
5 CRFetches 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.
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.
keywordcountrylimit- previous_output.keywordCan pick up a keyword from an earlier node if config.keyword is not set
- keyword_dataArray of keyword objectsEach 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 CRRuns 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.
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.
url- previous_output.urlCan pick up a URL from an earlier node if config.url is not set
- audit_dataObjectContains: 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 CRRuns 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.
Use this to analyze a website's loading speed performance and identify technical bottlenecks before sending an audit report.
url- previous_output.urlCan pick up a URL from an earlier node if config.url is not set
- speed_dataObjectContains: summary (overall score, load time, sizes, requests), metrics (TTFB, FCP, LCP, interactive), improve_page_performance (list of actionable optimization suggestions).
Google Search
2 CRFetches the top Google search results for a given query using the Serper.dev API.
Use this to perform live Google searches for competitor analysis, trend discovery, or factual verification before writing content.
qglhltbs- 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
- search_resultsObjectContains an array of top 10 organic search results and related searches.
Top Search Keywords
5 CRFetches the top organic search keywords that a specific domain ranks for using the DataForSEO Labs API.
Use this to perform competitor analysis or discover which keywords are already driving traffic to a website.
websitelimit- 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
- top_keywordsArray of keyword objectsContains ranked keywords with search volume, organic ranking difficulty (0-100), and estimated clicks.
Page Content
5 CRExtracts 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.
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.
urlenableJavascript- 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
- page_content_dataObjectContains: url, markdown (full page as Markdown string), main_topic, word_count, language, headings[]
Datasets
1 NodesCSV Import
FREEImport data from a CSV file uploaded by the user. Parses headers and rows into a structured object for downstream processing.
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.
csvContentfileNameDoes not consume upstream data.
- csv_dataObjectContains { headers: string[], rows: object[], row_count: number, file_name: string }
Agents
2 NodesAI Analyst
2 CRSends 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.
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.
systemPromptoutputFormat__nextNodeTypes- 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
- analyst_outputStringThe LLM's analysis text with SEO recommendations (or a structured brief if followed by AI Writer)
- analyst_outputsArray of stringsIf outputFormat is "json_array", this will be the parsed array of strings.
- analyst_outputs_countNumberIf outputFormat is "json_array", this will be the number of items in the array.
AI Writer
3 CRGenerates 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.
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.
topicoutlineanalystOutputIndexwritingInstructionscsvTopicColumncsvOutlineColumn- 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)
- draft_contentString or Array of StringsThe generated markdown blog post(s). In CSV Batch Mode this is always an array with one entry per row.
- csv_articles_countNumberIn CSV Batch Mode: how many articles were successfully generated.
Actions
5 NodesWP Draft
1 CRPublishes 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.
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.
integrationId*REQUIREDtitlecontentsiteUrlusernameappPassword- 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
- wp_draft_urlStringWordPress admin edit URL of the created draft (single post)
- wp_post_idNumberWordPress post ID (single post)
- wp_draft_urlsArray of stringsAdmin edit URLs for all created drafts (batch)
- wp_post_idsArray of numbersWordPress post IDs for all created drafts (batch)
- wp_status"draft_created"Confirmation that the draft was created successfully
- wp_posts_countNumberHow many drafts were created
Slack Message
1 CRSends 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}}).
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.
integrationId*REQUIREDmessage- (any upstream state key)Any key in the state can be referenced in the message using {{keyName}} syntax
- slack_status"message_sent"Confirmation that the Slack message was delivered
Monday: Create Item
1 CRCreates a new item in a Monday.com board when a workflow runs.
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.).
integrationId*REQUIREDitemName- draft_contentUsed to derive the item name from the article H1
- keyword_dataUsed as fallback item name
- monday_item_idNumberThe ID of the created Monday item
- monday_item_urlStringDirect URL to the Monday item
- monday_status"item_created"Confirmation string
Telegram Message
1 CRSends a message to a Telegram chat or channel using a saved Telegram integration. Supports {{variable}} placeholders.
Use this to notify your team when a workflow completes. Best placed at the end of a workflow.
integrationId*REQUIREDmessage- (any upstream state key)Any key in the state can be referenced in the message using {{keyName}} syntax
- telegram_status"message_sent"Confirmation that the Telegram message was delivered
Export Markdown
2 CRCollects 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.
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.
titleinstructions- 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
- export_markdownStringThe generated Markdown document content
- export_filenameStringSuggested filename for the download (e.g. "seo-report-1709942400000.md")
- export_status"ready"Confirmation that the export is ready for download