Skip to content
Agentivity
Star on GitHub Start free

Content, web, SEO and document nodes

Generated on 2026-10-20 from a running server by tools/reference.mjs. Do not edit this page by hand.

The steps that read the web and documents, and the steps that build content.

This page lists 21 nodes. How to read a node reference.

Content creation.

Step · in the catalogue: Content · type content.content_generator

Generates structured DSL content from diverse sources with LLM-powered content generation and deterministic layout.

When to use it. To have an AI write a structured page, such as an article or a landing page, from a description, with an optional brief, SEO data and links that must all appear in the text. It needs an LLM model connected; its page layout in DSL format then goes to DSL to HTML, DSL to Markdown or DSL to Elementor.

Effects. costs.

Fields

NameTypeRequiredDefaultWhat it is
content_descriptionTextyesDescription of the content to generate (user prompt - what, why, for whom).
seo_strategyTextnoSEO strategy data (from SEO Advisor or manual).
linksTextnoURLs to include (internal/external/references) - MANDATORY integration with link-first approach.
content_briefTextnoDetailed content brief with specific requirements.
toneTextnoprofessionalWriting tone: professional, casual, educational, conversational, etc.
word_countNumberno1000Target word count (approximate).
structure_hintsTextListnoStructure guidance: sections to include, flow suggestions.

Outputs

NameTypeWhat it holds
dsl_contentTextGenerated content, as a page layout in DSL format (JSON)
metadataTextContent metadata: topics, keywords, estimated reading time

Entries. In (Entry point)

Exits. Out (Default output port)

Places for resources

PlaceRequiredAcceptsHow many
LLM Modelyesllm.model.*1

Layout manipulation.

Step · in the catalogue: Content > Layout · type layout.add_block

Adds one or more blocks to the layout at a specified position. Supports single block object or array of blocks.

When to use it. To add one or more blocks, such as a call to action or an extra section, to a page layout in DSL format, at a place named by its path (such as main). Give the block as JSON, or a JSON list of blocks.

Fields

NameTypeRequiredDefaultWhat it is
layoutTextyesDSL layout JSON.
targetTextyesTarget path (e.g., ‘main’).
positionChoicenoappendInsert position. Choices: append, prepend, before, after, replace.
blockTextyesBlock(s) to add - single object or array of blocks (DSL JSON).

Outputs

NameTypeWhat it holds
layoutTextUpdated DSL layout JSON

Entries. In (Entry point)

Exits. Out (Default output port)

Step · in the catalogue: Content > Layout · type layout.move_block

Moves a block from source to target position in the layout.

When to use it. To move one block of a page layout in DSL format to another place, both named by their path (such as main.block[1] and main).

Fields

NameTypeRequiredDefaultWhat it is
layoutTextyesDSL layout JSON.
sourceTextyesSource path (e.g., ‘main.block[1]’).
targetTextyesTarget path (e.g., ‘main’).
positionChoicenoappendInsert position. Choices: append, prepend, before, after.

Outputs

NameTypeWhat it holds
layoutTextUpdated DSL layout JSON

Step · in the catalogue: Content > Layout · type layout.remove_block

Removes a block from the layout at the specified path.

When to use it. To take one block out of a page layout in DSL format, named by its path (such as root.main.section[2]).

Fields

NameTypeRequiredDefaultWhat it is
layoutTextyesDSL layout JSON.
targetTextyesTarget path to remove (e.g., ‘root.main.section[2]’).

Outputs

NameTypeWhat it holds
layoutTextUpdated DSL layout JSON

Step · in the catalogue: Content > Layout · type layout.replace_block

Replaces a block at the specified path with one or more new blocks.

When to use it. To swap one block of a page layout in DSL format, named by its path, for one or more new blocks given as JSON. To keep the block and add next to it, use Add Block instead.

Fields

NameTypeRequiredDefaultWhat it is
layoutTextyesDSL layout JSON.
targetTextyesTarget path to replace (e.g., ‘root.main.block[1]’).
blockTextyesNew block(s) - single object or array of blocks (DSL JSON).

Outputs

NameTypeWhat it holds
layoutTextUpdated DSL layout JSON

Layout format conversion nodes.

Step · in the catalogue: Content > Layout Adapters · type content.layoutadapters.dsl_to_elementor

Converts DSL content to Elementor-compatible format for WordPress

When to use it. To turn a page layout in DSL format, such as the one Content Generator gives, into an Elementor page for Publish to WordPress. To show images already uploaded, give a JSON list linking each image to its WordPress media ID.

Fields

NameTypeRequiredDefaultWhat it is
dsl_contentTextyesPage layout in DSL format (JSON), as Content Generator gives it.
titleTextnoOptional page/post title.
image_mappingsTextnoJSON array mapping image IDs to WordPress media IDs: [{image_id, media_id, media_url}].

Outputs

NameTypeWhat it holds
elementor_dataTextElementor-compatible JSON data
metadataTextContent metadata

Entries. In (Entry point)

Exits. Out (Default output port)

Step · in the catalogue: Content > Layout Adapters · type content.layoutadapters.dsl_to_email_html

Converts DSL content to email-compatible HTML with table layout and inline styles

When to use it. To turn a page layout in DSL format into the HTML of an e-mail, such as a newsletter, that displays well in mail apps, in your brand colors. For a web page, use DSL to HTML instead.

Fields

NameTypeRequiredDefaultWhat it is
dsl_contentTextyesPage layout in DSL format (JSON), as Content Generator gives it.
email_widthNumberno600Email width in pixels (default: 600).
brand_colorTextno#2563EBPrimary brand color in hex (default: #2563EB).
background_colorTextno#F3F4F6Background color in hex (default: #F3F4F6).
text_colorTextno#1F2937Text color in hex (default: #1F2937).
font_familyTextnoArial, Helvetica, sans-serifFont family (default: Arial, Helvetica, sans-serif).
include_responsiveBooleannotrueInclude media queries for mobile responsive (default: true).

Outputs

NameTypeWhat it holds
email_htmlTextGenerated email-compatible HTML
preview_textTextPreview text (first 100 characters of content)
metadataTextContent metadata

Step · in the catalogue: Content > Layout Adapters · type content.layoutadapters.dsl_to_html

Converts DSL content to semantic HTML with optional CSS framework support

When to use it. To turn a page layout in DSL format into HTML for a web page, plain or styled for Tailwind or Bootstrap. For an e-mail, use DSL to Email HTML instead.

Fields

NameTypeRequiredDefaultWhat it is
dsl_contentTextyesPage layout in DSL format (JSON), as Content Generator gives it.
css_frameworkTextnononeCSS framework: ‘tailwind’, ‘bootstrap’, or ‘none’ (default: ‘none’).
include_inline_stylesBooleannofalseInclude basic inline styles for spacing (default: false).
wrapper_classTextnoCSS class for the root wrapper div.
generate_toc_anchorsBooleannotrueGenerate ID attributes for headings (default: true).

Outputs

NameTypeWhat it holds
htmlTextGenerated HTML content
metadataTextContent metadata (heading count, word count, etc.)

Step · in the catalogue: Content > Layout Adapters · type content.layoutadapters.dsl_to_markdown

Converts DSL content to Markdown format

When to use it. To turn a page layout in DSL format into Markdown, for a documentation page, a README or any tool that takes Markdown. For a web page, use DSL to HTML instead.

Fields

NameTypeRequiredDefaultWhat it is
dsl_contentTextyesPage layout in DSL format (JSON), as Content Generator gives it.
generate_toc_anchorsBooleannotrueGenerate anchor links for TOC (default: true).
heading_prefixTextnoOptional prefix for all headings (e.g., project name).

Outputs

NameTypeWhat it holds
markdownTextGenerated Markdown content
metadataTextContent metadata (heading count, word count, etc.)

Web scraping and content extraction.

Step · in the catalogue: Web · type http.request

Calls a web API: GET, POST, PUT, PATCH, DELETE or HEAD, with parameters, headers and a body, and gives the status and the answer (as JSON when it is JSON).

When to use it. To use a service that has a web API but no step of its own in the catalog: create or read a record, send data to another tool, call a webhook. Only public addresses can be called, never the local machine or a private network. To read a web page as text, use Scrape Web Page instead.

Example. method: POST, url: https://api.example.com/orders, body: {“customer”: “form.email”}

Effects. reads outside, changes something outside.

Fields

NameTypeRequiredDefaultWhat it is
methodChoicenoGETThe HTTP method. Choices: GET, POST, PUT, PATCH, DELETE, HEAD.
urlTextyesThe address to call, in full (https://…).
queryStructurednoParameters added to the address, as a JSON object: {“page”: “2”}.
headersStructurednoHeaders sent with the call, as a JSON object: {“Accept”: “application/json”}. Put a key in an HTTP API connection rather than here.
bodyTextnoWhat is sent with POST, PUT, PATCH or DELETE — usually JSON.
content_typeChoicenoHow the body is written (guessed from the body when left empty). Choices: json, text, form.
credentialsCredentialsnoThe HTTP API connection whose key signs the call, when the API needs one. Connection of type http_api.
timeout_secondsNumberno30How long to wait for the answer, in seconds.
max_response_charsNumberno100000The most characters of the answer kept.
rate_limit_profileChoicenomediumHow long to wait and try again when the service is busy (readings only: a call that changes something is never sent twice). Choices: none, fast, medium, slow.

Outputs

NameTypeWhat it holds
statusNumberThe HTTP status the service answered (empty when it could not be called)
bodyTextThe answer, as text
jsonStructuredThe answer read as JSON, when it is JSON
headersStructuredThe headers of the answer, as a JSON object
urlTextThe address that answered (after any redirect)
errorTextWhy the call failed, when it did

Entries. In (Entry point)

Exits. Out (The service answered 2xx), Error (The service answered with an error, or could not be called — see ‘error’)

Step · in the catalogue: Web · type web.scrape

Reads a web page as Markdown, ready for an LLM prompt. Uses the connected web scraper, or the free Direct scraper when none is connected.

When to use it. To read the content of one web page from its link, for example a link a person gave, so an AI step can work on it. Not for finding pages on a subject: use a web search instead.

Effects. reads outside.

Fields

NameTypeRequiredDefaultWhat it is
urlTextyesThe page to read (http or https).
timeout_secondsNumberno30How long to wait for the page.
max_content_lengthNumberno50000Longest content kept, in characters.

Outputs

NameTypeWhat it holds
markdownTextThe page content as Markdown
textTextThe same content as plain text
urlTextThe URL that was read
metadataStructuredPage details (title, description…) as a JSON object, when the scraper provides them
structured_dataStructuredThe data the page embeds for machines (JSON-LD, page state, meta tags, microdata), compacted — often holds exact values (prices, ratings, dates) that the readable content only shows in passing
cleaningStructuredWhat cleaning took out of the page: sizes before and after, and what was removed
errorTextWhy reading failed, when it did

Entries. In (Entry point)

Exits. Scraped (The page was read successfully), Failed (The page could not be read — see ‘error’)

Places for resources

PlaceRequiredAcceptsHow many
Web Scrapernoweb.scraper.*1

Web scraping resource nodes and providers.

Resource · in the catalogue: Web > Scrappers · type web.scraper.direct

Scrape web pages using direct HTTP requests (free, simple, limited features).

When to use it. To read web pages for free, with no account, from a step that reads pages such as Scrape Web Page. For pages that only show their content once scripts run in the browser, use Firecrawl Scraper instead.

Effects. reads outside.

Plugs into a place that accepts web.scraper.*.

Resource · in the catalogue: Web > Scrappers · type web.scraper.firecrawl

Scrape web pages using Firecrawl API (premium, JS rendering, clean markdown).

When to use it. To read pages the free scrapers cannot, such as pages built by scripts in the browser, with your own Firecrawl account (an API key). Connect it to a step that reads pages, such as Scrape Web Page.

Effects. reads outside.

Fields

NameTypeRequiredDefaultWhat it is
credentialsCredentialsyesFirecrawl API credentials. Connection of type firecrawl.

Plugs into a place that accepts web.scraper.*.

Resource · in the catalogue: Web > Scrappers · type web.scraper.jina

Scrape web pages using Jina AI Reader (free, clean markdown output).

When to use it. To read web pages as clean text for free through Jina AI Reader, with no account, from a step that reads pages such as Scrape Web Page. Useful when the Direct Scraper keeps too much clutter.

Effects. reads outside.

Plugs into a place that accepts web.scraper.*.

Web search nodes backed by external search providers.

Step · in the catalogue: Web > Search · type web.search.searxng

Searches the web through a SearXNG instance and returns normalized organic results.

When to use it. To search the web in a workflow through a SearXNG server you run or trust, given by its address, with no paid account; the results go to the next steps. For an agent that searches by itself, use AI Agent Web Search Tool (SearXNG).

Effects. reads outside, costs.

Fields

NameTypeRequiredDefaultWhat it is
credentialsCredentialsyesSearXNG credentials. Connection of type searxng.
queryTextyesSearch query.
top_kNumberno5Maximum number of results.
languageTextnoOptional language hint.
siteTextnoOptional site/domain filter.
rate_limit_profileChoicenomediumRate limiting and retry profile. Choices: none, fast, medium, slow.

Outputs

NameTypeWhat it holds
providerTextSearch provider identifier
queryTextOriginal search query
effective_queryTextExecuted search query including filters
result_countNumberNumber of search results returned
results_jsonTextThe results (rank, title, URL, snippet) as JSON
urlsTextListReturned result URLs
errorTextWhy the search failed, when it did

Entries. In (Entry point)

Exits. Found (The search ran — its results are in the outputs (there can be none)), Failed (The search could not run — see ‘error’)

Step · in the catalogue: Web > Search · type web.search.serpapi

Searches the web through SerpApi and returns normalized organic results.

When to use it. To search the web in a workflow through your own SerpApi account (an API key); the results go to the next steps. For an agent that searches by itself, use AI Agent Web Search Tool (SerpApi).

Effects. reads outside, costs.

Fields

NameTypeRequiredDefaultWhat it is
credentialsCredentialsyesSerpApi credentials. Connection of type serpapi.
queryTextyesSearch query.
top_kNumberno5Maximum number of results.
languageTextnoOptional language hint.
siteTextnoOptional site/domain filter.
rate_limit_profileChoicenomediumRate limiting and retry profile. Choices: none, fast, medium, slow.

Outputs

NameTypeWhat it holds
providerTextSearch provider identifier
queryTextOriginal search query
effective_queryTextExecuted search query including filters
result_countNumberNumber of search results returned
results_jsonTextThe results (rank, title, URL, snippet) as JSON
urlsTextListReturned result URLs
errorTextWhy the search failed, when it did

Entries. In (Entry point)

Exits. Found (The search ran — its results are in the outputs (there can be none)), Failed (The search could not run — see ‘error’)

Step · in the catalogue: Web > Search · type web.search.tavily

Searches the web through Tavily and returns normalized organic results.

When to use it. To search the web in a workflow through your own Tavily account (an API key); the results go to the next steps. For an agent that searches by itself, use AI Agent Web Search Tool (Tavily).

Effects. reads outside, costs.

Fields

NameTypeRequiredDefaultWhat it is
credentialsCredentialsyesTavily API credentials. Connection of type tavily.
queryTextyesSearch query.
top_kNumberno5Maximum number of results.
languageTextnoOptional language hint.
siteTextnoOptional site/domain filter.
rate_limit_profileChoicenomediumRate limiting and retry profile. Choices: none, fast, medium, slow.

Outputs

NameTypeWhat it holds
providerTextSearch provider identifier
queryTextOriginal search query
effective_queryTextExecuted search query including filters
result_countNumberNumber of search results returned
results_jsonTextThe results (rank, title, URL, snippet) as JSON
urlsTextListReturned result URLs
errorTextWhy the search failed, when it did

Entries. In (Entry point)

Exits. Found (The search ran — its results are in the outputs (there can be none)), Failed (The search could not run — see ‘error’)

SEO analysis and optimization.

Step · in the catalogue: SEO · type seo.links.suggest

Suggests relevant internal links using structure-first selection with semantic scoring.

When to use it. To choose which pages of your own site a new article should link to, with link texts written by an AI, from the site structure Sitemap Structure gives. Not for links to other sites: it only suggests pages of your site.

Effects. costs.

Fields

NameTypeRequiredDefaultWhat it is
article_topicTextyesArticle topic or title.
article_summaryTextnoBrief article summary/outline (optional).
site_structureTextyesSite structure (JSON), as the Sitemap Structure step gives it.
max_linksNumberno10Maximum links to suggest.
parent_pillar_urlTextnoParent pillar URL (required for best results).
quota_parent_pillarNumberno1Links to parent pillar.
quota_sibling_pillarsNumberno2Links to sibling pillars.
quota_same_pillar_leavesNumberno4Links to leaves in same pillar.
quota_other_pillarsNumberno2Links to other relevant pillars.
quota_cross_pillar_leavesNumberno1Links to leaves in other pillars.

Outputs

NameTypeWhat it holds
suggested_linksTextList of suggested links (JSON array)
total_suggestionsNumberNumber of links suggested

Entries. In (Entry point)

Exits. Out (Default output port)

Places for resources

PlaceRequiredAcceptsHow many
LLM Modelyesllm.model.*1
Embeddingsnoai.embeddings.*1

Step · in the catalogue: SEO · type seo.sitemap.analyze

Parses XML sitemap and extracts page information for SEO analysis.

When to use it. To list the pages of a website from its XML sitemap (such as https://example.com/sitemap.xml), optionally with each page’s title and description, as the start of an SEO workflow. Give its pages to Sitemap Structure.

Effects. reads outside.

Fields

NameTypeRequiredDefaultWhat it is
sitemap_urlTextyesSitemap XML URL (e.g., https://example.com/sitemap.xml).
fetch_contentBooleannofalseFetch page content (title, H1, meta description, excerpt).
max_pagesNumberno0Maximum pages to analyze (0 = all).

Outputs

NameTypeWhat it holds
pagesTextList of sitemap pages (JSON array)
total_pagesNumberTotal number of pages found

Step · in the catalogue: SEO · type seo.sitemap.structure

Analyzes sitemap pages using LLM to create hierarchical content structure (pillars & clusters).

When to use it. To group a site’s pages into main topics (pillars) and topic clusters with an AI, from the page list Sitemap Analyzer gives. Its result feeds Internal Link Suggester.

Effects. reads outside, costs.

Fields

NameTypeRequiredDefaultWhat it is
pagesTextyesSitemap pages (JSON array), as the Sitemap Analyzer step gives it.
site_nameTextnoWebsiteWebsite name/brand.
max_pillarsNumberno10Maximum content pillars to identify.
scrape_pagesBooleannotrueScrape pages to analyze content and internal links (slower but more accurate).
max_pages_to_scrapeNumberno50Maximum pages to scrape for analysis (0 = all).
max_topics_per_pageNumberno8Maximum topics to extract per page.
min_topic_similarityNumberno0.3Minimum similarity threshold for topic edges (0.0-1.0).
max_topics_after_reductionNumberno100Maximum topics after set-cover reduction.
cluster_cohesion_thresholdNumberno0.5λ₂ threshold for cluster cohesion (0.0-1.0).
min_cluster_sizeNumberno2Minimum cluster size.
assignment_marginNumberno0.1Minimum gap between best/2nd cluster for assignment (0.0-0.3).
min_child_supportNumberno0.1Minimum fraction of cluster pages pillar must link to (0.0-1.0).

Outputs

NameTypeWhat it holds
site_structureTextSite structure with pillars, topic clusters, and orphan pages (JSON)
total_pillarsNumberNumber of content pillars identified
total_clustersNumberNumber of topic clusters identified

Places for resources

PlaceRequiredAcceptsHow many
LLM Modelyesllm.model.*1
Embeddingsyesai.embeddings.*1
Scrapernoweb.scraper.*1

Read the text of documents (PDF, Word, text).

Step · in the catalogue: Documents · type document.extract_text

Reads a PDF, Word (.docx), or plain-text/Markdown file — an uploaded file (file_id) or raw bytes (file_base64) — and returns its content as Markdown, ready for an LLM prompt.

When to use it. To get the text of a PDF, Word (.docx), text or Markdown file a person uploaded, so an AI step can read it. Not for web pages: use Scrape Web Page instead.

Fields

NameTypeRequiredDefaultWhat it is
file_idTextyesReference of an uploaded file (the fileId a SourceInput upload returns) — use this OR file_base64. The file name and format come from the upload.
file_base64TextyesThe document’s raw bytes, base64-encoded — use this OR file_id.
file_nameTextyesOriginal file name, including its extension (e.g. ‘resume.pdf’) — the extension is what selects PDF, Word, or plain-text reading. Required with file_base64; taken from the upload when file_id is given.

Outputs

NameTypeWhat it holds
markdownTextThe document’s content as Markdown — headings, lists and emphasis preserved where the source format carries them
textTextThe same content with Markdown syntax stripped, for word counts or search
formatTextWhich extractor read the file: ‘pdf’, ‘docx’, or ‘text’
metadataStructuredExtraction details (e.g. page_count, word_count) as a JSON object
errorTextWhy extraction failed, when it did

Entries. In (Entry point)

Exits. Extracted (The document’s text was read successfully), Failed (The document could not be read — see ‘error’)