
Each local area page used to take us half a day to create and optimize.
With SEOmatic, we can create hundreds of pages in the same time, which helps our clients make the best use of their budget.
It's transformed how we deliver scalable SEO solutions.
Will Hawkins
Marketing Director, Digi-Business UK
Agents read your Search Console data, do the work, and prove what actually moved. You decide what ships.
14-Day Trial for $1, credited to your first payment.
Zapier SEO automation with SEOmatic, no code: wire your Search Console data, site audits, AI visibility and SEO fixes into the apps you already use. Triggers fire your Zaps on SEOmatic events, searches let a Zap or an AI agent ask SEOmatic anything, and actions let it act on your site. Every operation and every field is documented below, straight from the shipped integration.
On Zapier, an integration's searches and actions are the tools exposed to AI agents, so SEOmatic works as a full agent inside Zapier MCP, Zapier Agents, and AI Actions, not only as a set of webhooks. A Zap, or an agent driving Zapier, can query Search Console, compare periods, read backlinks, check indexing, and then propose fixes or whole campaigns, all in one workflow. The integration exposes 202 operations: 83 searches, 103 actions, and 16 triggers covering 15 events.
Every step authenticates through your OAuth connection (a Bearer token under the hood) and hits the SEOmatic API directly. A trigger subscribes a Zap to an event; a search runs a read and returns mappable fields; an action performs a change, which SEOmatic keeps proposal-based and approval-gated. A typical Zap chains all three:
Trigger ai_visibility.scan_completed (a scan just finished)
↓
Search Find Query Page Matrix (find cannibalized queries)
↓
Action Create SEO Tasks (propose fixes, approval-gated)
↓
Send to Slack / email / a sheet (any of Zapier's 8,000 apps)Add SEOmatic in Zapier, click Connect, and approve in the SEOmatic consent screen. You pick the workspace there, and no API key is ever pasted. Connecting needs the Infrastructure plan. The connection is tested against a plan-gated endpoint at connect time, so a workspace on another plan fails immediately with a clear message instead of building Zaps that error later.
| Setting | Value |
|---|---|
| Auth type | OAuth 2.1 (PKCE): click Connect, approve, done |
| Grants | one workspace, chosen on the consent screen |
| Revoke from | Settings, AI Agents, API Keys |
| Tested against | GET /api/v1/zapier/me |
| Plan to connect | Infrastructure (or Enterprise) |
| Plan for triggers, searches and actions | Infrastructure (or Enterprise) |
Every event has its own named trigger, plus a generic "New SEOmatic Event" trigger with an event dropdown. Each subscribes a Zap to a SEOmatic event as a REST-hook: when the event fires, your Zap runs, through the same signed, retried delivery pipeline as first-class webhooks.
| Trigger | Event | Fires when |
|---|---|---|
| New Published Page | page.published | A page goes live on your site. |
| Page Publish Failed | page.publish_failed | A publish attempt fails, so a Zap can alert or retry. |
| Task Completed | task.completed | An SEO agent task finishes. |
| Change Live on Your Site | task.live | SEOmatic opened your live page and saw an agent change on it, not just saved in your CMS. |
| Task Awaiting Approval | task.awaiting_approval | The agent stages work that needs your approval, so the decision can happen in Slack or email via the Decide SEO Task action. |
| Task Approved or Dismissed | task.decided | Someone approves or dismisses an agent task, from the dashboard, email, Slack, a client approval link or an AI assistant. |
| Campaign Completed | campaign.completed | A bulk-page or content campaign finishes. |
| AI Visibility Scan Completed | ai_visibility.scan_completed | An AI-visibility scan finishes. |
| Site Audit Completed | site_audit.completed | A deep site audit finishes, with the health score and how many problems are new or fixed. |
| Ranking Dropped | ranking.dropped | A search that brings you clicks slips in Google, or a search you track in the Rank Tracker drops 3+ places for 2 days or leaves the Google Maps top 3. |
| Ranking Page Changed | ranking.page_changed | Google starts showing a different page of your site for a search you track: two of your pages compete for it. |
| New Google Review | review.received | A new review arrives on your Google Business Profile, with the stars, the text and the reply SEOmatic drafted for your approval. |
| Weekly Business Profile Calls | business_profile.calls_report | Every Monday, with last week's calls, direction requests and website clicks from your Business Profile, and the week before. |
| Business Profile Update Due | business_profile.update_due | On your update day, when no Business Profile update was drafted this week. |
| Possible Duplicate Listing | business_profile.duplicate_found | Another Google Maps listing looks like your business. Nothing is changed for you. |
scan_completedTriggers when an AI-visibility scan finishes.
No input fields. It runs on the connected workspace.
business_profile_update_dueTriggers on your update day when no Google Business Profile update was drafted this week. Send a job photo with one line about the job and SEOmatic drafts the update for approval.
No input fields. It runs on the connected workspace.
campaign_completedTriggers when a bulk-page or content campaign finishes.
No input fields. It runs on the connected workspace.
task_liveTriggers when SEOmatic opened your live page and saw an agent change on it (not just saved in your CMS).
No input fields. It runs on the connected workspace.
review_receivedTriggers when a new review arrives on your Google Business Profile, with the stars, the review text and the reply SEOmatic drafted for your approval.
No input fields. It runs on the connected workspace.
new_published_pageTriggers when a page goes live on your site.
No input fields. It runs on the connected workspace.
page_publish_failedTriggers when a publish attempt fails, so you can alert or retry.
No input fields. It runs on the connected workspace.
business_profile_duplicate_foundTriggers when another Google Maps listing looks like your business. Duplicates can get a profile suspended. Nothing is changed for you.
No input fields. It runs on the connected workspace.
ranking_droppedTriggers when a search that brings you clicks slips in Google (Search Console, last 2 weeks vs the 4 before), or when a search you track in the Rank Tracker drops 3+ places for 2 days or leaves the Google Maps top 3. Says which page, by how much, and who passed you when known.
No input fields. It runs on the connected workspace.
ranking_page_changedTriggers when Google starts showing a different page of your site for a search you track: two of your pages compete for it. Says both pages and the fix waiting for approval.
No input fields. It runs on the connected workspace.
site_audit_completedTriggers when a deep site audit finishes, with the health score and how many problems are new or fixed since the last audit.
No input fields. It runs on the connected workspace.
task_decidedTriggers when someone approves or dismisses an agent task, from the dashboard, email, Slack, a client approval link or an AI assistant. `decision` is approve or dismiss and `decided_by` says where.
No input fields. It runs on the connected workspace.
task_awaiting_approvalTriggers when the agent stages work that needs your approval. Route it to Slack or email and decide with the Decide SEO Task action, without opening the dashboard.
No input fields. It runs on the connected workspace.
task_completedTriggers when an SEO agent task finishes. `live` says whether the change is already on your live page; use "Change Live on Your Site" to act only once it is.
No input fields. It runs on the connected workspace.
business_profile_calls_reportTriggers every Monday with the calls, direction requests and website clicks your Google Business Profile got in the last 7 days, and the week before for comparison.
No input fields. It runs on the connected workspace.
eventTriggers when a SEOmatic event fires: a page publishes, a task or campaign completes, a task awaits your approval or is approved or dismissed, an AI-visibility scan or site audit finishes, a ranking drops or changes page, a Google review arrives, or your Business Profile has news.
| Field | Type | Required | Description |
|---|---|---|---|
event | string | yes | Which SEOmatic event should start this Zap.page.published · page.publish_failed · task.completed · campaign.completed · ai_visibility.scan_completed · task.awaiting_approval · task.live · ranking.dropped · ranking.page_changed · review.received · business_profile.calls_report · business_profile.update_due · business_profile.duplicate_found · site_audit.completed · task.decidedDefault: page.published |
A search looks something up in SEOmatic and returns fields you can map into any downstream step. Most searches only read. Three do more: Run AI Visibility Scan starts a new scan and uses AI credits, and Upload CSV and Import Attachment as Dataset create a dataset in your workspace. Searches are grouped here by data source, the same taxonomy as the REST API reference.
Your own Search Console property: queries, pages, dimensions, comparisons.
get_search_queriesFinds the top search queries from Google Search Console for the connected website. Returns queries with clicks, impressions, CTR, and average position. Use this to understand what keywords the site ranks for. These are SITE-WIDE query totals (all pages combined), never one page's numbers - use get_qu…
| Field | Type | Required | Description |
|---|---|---|---|
days | number | no | Number of days to look back (1-90, default 28) |
limit | number | no | Number of results to return (1-5000, default 50). Use the default unless the user explicitly asks for more data. |
get_top_pagesFinds the top-performing pages from Google Search Console for the connected website. Returns pages ranked by clicks with impressions, CTR, and average position.
| Field | Type | Required | Description |
|---|---|---|---|
days | number | no | Number of days to look back (1-90, default 28) |
limit | number | no | Number of results to return (1-5000, default 50). Use the default unless the user explicitly asks for more data. |
get_query_page_matrixFinds the query-to-page map from Google Search Console: which page ranks for which query, with clicks, impressions, and position per pair. THE tool for cannibalization analysis - a query appearing with multiple pages means those pages compete for the same intent. Also answers "which page captures thi…
| Field | Type | Required | Description |
|---|---|---|---|
days | number | no | Number of days to look back (1-90, default 28) |
maxRows | number | no | Max query-page pairs to return (100-1000, default 200) |
get_query_pagesReturns which pages rank for specific search queries, with PAGE-LEVEL clicks, impressions, CTR and average position for each (query, page) pair, best page first - plus the query's site-wide total, labelled separately. Call this BEFORE staging or re-staging any page task for a query, to pick the page that a…
| Field | Type | Required | Description |
|---|---|---|---|
queries | string | yes | Exact search queries (1-5), as they appear in GSC |
page | string | no | Optional full page URL to check against each query (returns its own row or null) |
days | number | no | Look-back window in finalized days (1-90, default 28) |
get_performance_trendFinds search performance over time from Google Search Console. Returns daily clicks and impressions data for trend analysis.
| Field | Type | Required | Description |
|---|---|---|---|
days | number | no | Number of days to look back (7-90, default 28) |
inspect_url_indexingChecks if a specific URL is indexed by Google and get detailed indexing diagnostics. Returns the indexing verdict (PASS/FAIL/NEUTRAL), coverage state (e.g. "Submitted and indexed", "Crawled - currently not indexed"), robots.txt status, crawl status, canonical URL analysis, last crawl time, and mobil…
| Field | Type | Required | Description |
|---|---|---|---|
url | string | yes | The fully-qualified URL to inspect e.g. example.com/my-page |
batch_inspect_urlsChecks indexing status for multiple URLs at once. Returns a summary for each URL including whether it is indexed, the coverage state, and any issues. Use this when the user wants to check many pages at once. Limited to 50 URLs per call; when Google answers slowly the call returns the URLs it finishe…
| Field | Type | Required | Description |
|---|---|---|---|
urls | string | yes | Array of fully-qualified URLs to inspect (max 50) |
find_cannibalizationDetects keyword cannibalization: queries where two or more of your pages compete for the same search, splitting clicks and destabilizing position. Returns the affected queries with each competing page. Same user need: consolidate and 301. Distinct needs: differentiate, never merge.
| Field | Type | Required | Description |
|---|---|---|---|
days | number | no | |
minImpressions | number | no | Ignore queries below this impression volume |
get_brand_splitReturns split search performance into brand vs non-brand queries. Answers "is my SEO actually improving, or is growth just people searching my name?" Provide your brand terms; without them, the domain name is used.
| Field | Type | Required | Description |
|---|---|---|---|
days | number | no | |
brandTerms | string | no | Brand words/variants, lowercase (e.g. ["seomatic"]). Defaults to the domain name. |
find_ctr_outliersFinds pages whose click-through rate is far below what their position should earn, against the expected CTR for their position (the same curve every SEOmatic answer uses; brand queries excluded, since they inflate CTR). Before proposing a title rewrite, check the SERP: an AI Overview or other SERP f…
| Field | Type | Required | Description |
|---|---|---|---|
days | number | no | |
minImpressions | number | no | Only judge pages with at least this many impressions |
get_search_appearanceBreaks performance down by search appearance (rich results, videos, product snippets, review stars...). Shows which enhanced results you already earn and how they convert vs plain listings - the case for adding structured data where a rich result exists for that page type.
| Field | Type | Required | Description |
|---|---|---|---|
days | number | no |
get_discover_news_performanceReturns performance in Google Discover, Google News, Image search, or Video search - surfaces GSC reports separately from web search. Zero rows means no presence on that surface (common, not an error).
| Field | Type | Required | Description |
|---|---|---|---|
surface | string | no | discover · news · image · video |
days | number | no |
get_folder_performanceRolls search performance up by URL folder (/blog/, /products/, /docs/...): clicks, impressions, page counts, and average position per site section. The agency-report view of where a site earns its traffic.
| Field | Type | Required | Description |
|---|---|---|---|
days | number | no | |
depth | number | no | Path depth to group by (1 = /blog/, 2 = /blog/topic/) |
Visibility, citations, and traffic inside AI answer engines: scans, tracked prompts, crawler activity, and first-party observed citations.
get_ai_visibilityReads the workspace's latest completed AI-search visibility scan: per-engine brand visibility (ChatGPT, Claude and Google AI Overviews by default, plus any engine the monitor tracks: Perplexity, Google AI Mode, Copilot, Gemini, Grok), the prompts where the brand was MISSED and who won them instead,…
| Field | Type | Required | Description |
|---|---|---|---|
scanId | string | no | A specific scan to read (from recentScans). Omit for the latest completed scan. |
list_tracked_promptsReturns the AI-visibility monitor's tracked prompts (the questions scans ask every engine) with each prompt's id, active state and source, plus the plan's prompt allowance, current cadence, and every AI engine with whether it is tracked and its typical credits per question per scan (runsPerScan runs includ…
| Field | Type | Required | Description |
|---|---|---|---|
locationCode | integer | no | Locale location code (default: the primary monitor locale) |
languageCode | string | no | Locale language code, e.g. "en" |
get_ai_crawler_activityReturns which AI bots (GPTBot, ChatGPT-User, PerplexityBot, ClaudeBot…) visited the user's site, classified by purpose (answer-time retrieval / AI-search indexing / model training), with per-bot trends, top crawled pages and the crawl→citation funnel. Needs a one-time setup (WordPress plugin or Cloudflare…
| Field | Type | Required | Description |
|---|---|---|---|
windowDays | integer | no |
get_observed_citationsReads citations of this site observed in REAL, logged-in AI answers (ChatGPT, Perplexity, Gemini, Copilot, Claude, Google AI Overviews), captured by the user's own browser extension. This is the one dataset a server-side scan cannot produce: engines personalize and gate their APIs, so a scan sees a…
| Field | Type | Required | Description |
|---|---|---|---|
days | integer | no | Look-back window in days (1-90). Default 28. |
get_page_ai_activityReads which of this site's pages AI answer engines actually engage with: how many times AI answer crawlers FETCHED each page (the step that precedes a citation) and how many visits an AI assistant REFERRED back to it. First-party data from the site's own SEOmatic WordPress plugins, so it shows real…
| Field | Type | Required | Description |
|---|---|---|---|
days | integer | no | Look-back window in days (1-90). Default 28. |
limit | integer | no | Max pages to return (1-50). Default 20. |
Metrics, clusters, intent, and trends for keyword research.
get_keyword_metricsFinds detailed SEO metrics for specific keywords including search volume, keyword difficulty (0-100), CPC, competition level, and search intent. Use this when the user asks about specific keywords, whether a niche is competitive, or how hard it is to rank for a keyword.
| Field | Type | Required | Description |
|---|---|---|---|
keywords | string | yes | Keywords to analyze (1-20 keywords) |
location_code | number | no | Location code (default: the site's own market). Examples: 2840 US, 2826 UK, 2250 France, 2276 Germany. |
language_code | string | no | Language code (default: the site's own language). Examples: "en", "fr", "de". |
get_keyword_suggestionsFinds keyword ideas and suggestions from one or more seed keywords. Returns related keywords with search volume, difficulty, CPC, and search intent. IMPORTANT: Pass ALL seed keywords in a single call instead of calling multiple times - this is much faster.
| Field | Type | Required | Description |
|---|---|---|---|
keywords | string | yes | Seed keywords to get suggestions for (up to 10 at once) |
limit | number | no | Number of suggestions per keyword (1-100, default 20). Use the default unless the user explicitly asks for more. |
location_code | number | no | Location code (default: the site's own market). |
language_code | string | no | Language code (default: the site's own language). |
compare_keywordsCompares Google Trends interest for multiple keywords side by side. Shows relative search interest over time. Useful for deciding which keywords to target.
| Field | Type | Required | Description |
|---|---|---|---|
keywords | string | yes | List of keywords to compare (2-5 keywords) |
geo | string | no | Country code to filter by (e.g., "US", "FR"). Leave empty for worldwide. |
get_keyword_clustersReturns the agent's keyword-cluster map from the workspace's GSC query universe. Each cluster: topic, queries, landing pages, verdict (pillar | cannibalization | gap | covered), impressions.
| Field | Type | Required | Description |
|---|---|---|---|
verdict | string | no | Only clusters with this verdictpillar · cannibalization · gap · covered |
limit | integer | no | Max clusters to return. |
get_keyword_trendsFinds Google Trends interest over time data for a keyword. Shows how search interest has changed over the past year. Useful for understanding seasonality and trending topics.
| Field | Type | Required | Description |
|---|---|---|---|
keyword | string | yes | The keyword to check trends for |
geo | string | no | Country code to filter by (e.g., "US", "FR", "GB"). Leave empty for worldwide. |
Referring domains, anchors, and link velocity.
get_backlink_summaryFinds a backlink profile summary for a domain including total backlinks, referring domains, domain rank, spam score, and link type distribution. Use this when the user asks about link-building, netlinking, backlink strategy, or domain authority.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | yes | The domain to analyze backlinks for (e.g., "backmarket.com") |
get_backlink_anchorsFinds the anchor-text distribution of a domain’s backlink profile (anchor, backlink count, referring domains per anchor). Use to assess anchor diversity, over-optimization risk (too many exact-match anchors), and brand-vs-generic anchor balance.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | yes | The domain to analyze (e.g., "example.com") |
limit | number | no | Max anchors to return (default 25) |
get_backlink_velocityFinds monthly new vs lost referring domains for a domain over recent months. Use to judge link-building momentum, detect link decay or a negative-SEO spike, and compare acquisition pace against competitors.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | yes | The domain to analyze (e.g., "example.com") |
months | number | no | How many months back (default 6) |
get_referring_domainsLists the top referring domains linking to a domain, ordered by domain rank. Use for link-profile analysis, competitor backlink-gap research ("who links to them but not to us"), and finding link sources worth pitching. Goes straight to the data vendor (no BYO path).
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | yes | The domain to analyze (e.g., "competitor.com") |
limit | number | no | Max referring domains to return (default 50) |
find_link_prospectsFinds LINK PROSPECTS: referring domains that link to the given competitors but NOT to this workspace's site (classic link intersect). A domain linking to several competitors is a pre-qualified, warm outreach target. Use with the Backlink Outreach skill to qualify prospects and draft outreach; drafts…
| Field | Type | Required | Description |
|---|---|---|---|
competitors | string | yes | 1-3 competitor domains (e.g., ["competitor.com"]) |
limit | number | no | Max prospects to return (default 30) |
SERP features, rankings, and domain-level competitive data.
get_serp_featuresShows which SERP features (AI Overview, featured snippet, People Also Ask, local pack, video, shopping, etc.) appear on the Google results page for up to 10 keywords. Use to judge how much organic room a query really has and whether AI Overviews are absorbing its clicks.
| Field | Type | Required | Description |
|---|---|---|---|
keywords | string | yes | Keywords to inspect (1-10) |
location_code | number | no | Location code (default: the site's own market). Examples: 2840 US, 2826 UK, 2250 France, 2276 Germany. |
language_code | string | no | Language code (default: the site's own language). Examples: "en", "fr", "de". |
get_domain_rankingsFinds the top keywords a domain ranks for in Google search results. Returns keywords with search volume, difficulty, and ranking data. Use this when the user asks about a site's SEO performance, best rankings, or what keywords a site ranks for.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | yes | The domain to analyze (e.g., "backmarket.com") |
limit | number | no | Number of keywords to return (1-100, default 30) |
location_code | number | no | Location code (default: the site's own market). |
language_code | string | no | Language code (default: the site's own language). |
get_domain_overviewFinds an overview of a domain's SEO visibility including organic ranking distribution (keywords at position 1, positions 2-3, 4-10 and so on, plus true top-3 and top-10 totals), estimated traffic volume, and estimated traffic cost. Use this for a high-level SEO performance snapshot of any domain.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | yes | The domain to analyze (e.g., "backmarket.com") |
location_code | number | no | Location code (default: the site's own market). |
language_code | string | no | Language code (default: the site's own language). |
get_domain_competitorsFinds competing domains in organic search results. Shows domains that rank for similar keywords with keyword intersection counts, average positions, and estimated traffic. Use this when the user asks about competitors or competitive landscape.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | yes | The domain to find competitors for (e.g., "backmarket.com") |
limit | number | no | Number of competitors to return (1-50, default 20) |
location_code | number | no | Location code (default: the site's own market). |
language_code | string | no | Language code (default: the site's own language). |
Google Business Profile locations, visibility, and reviews.
get_local_visibilityMeasures a site's LOCAL search visibility for specific money keywords: its organic positions, whether Google shows a local (map) pack and who occupies it, which directories (Psychology Today, Yelp, Zocdoc…) own the top 10, and the non-directory competitors. Includes the business's Google Business Pr…
| Field | Type | Required | Description |
|---|---|---|---|
keywords | string | yes | Geo-modified money keywords to measure (1-5). Include the city/area the business serves. |
location_name | string | no | City-level SERP location as a DataForSEO canonical name: "City,Region,Country" with full names, no abbreviations (e.g. "New York,New York,United States", "Lyon,Auvergne-Rhone-Alpes,France"). Strongly recommended when the business serves a known city… |
location_code | number | no | Location code override (defaults to the workspace market). Ignored when location_name is set. |
language_code | string | no | Language code override (defaults to the workspace market). |
The agent's own work: diagnosis, tasks, and strategy.
get_seo_signalReads ONE cached agent signal in full (compacted) - the same raw data the weekly diagnosis reasons over, beyond the digest's summary. FREE: reads the cache only, never gathers, never spends credits. Useful kinds: index_coverage (pages Google has NOT indexed + why), backlink_profile (link velocity/an…
| Field | Type | Required | Description |
|---|---|---|---|
signal | string | yes | Which cached signal to readsitemap · content_inventory · gsc_performance · geo_gaps · content_scores · pagespeed · keyword_metrics · link_graph · keyword_gaps · index_coverage · brand_mentions · conversion_data · conversion_impact · product_status · local_presence · local_visibility · citation_audit · link_equity · serp_snapshot · serp_displacements · rival_sitemaps · answer_shifts · ai_surface · topic_trends · true_keyword_gaps · ai_referrals · reddit_topics · ads_performance · page_audit · bootstrap_keywords · backlink_profile · score_calibration · skill_effectiveness · chat_initiative · ai_crawler_probe · fact_finder · gsc_ai_report |
get_content_scoresReturns aI-search content scores for the workspace's generated articles: average score plus the weakest items (improvement candidates).
| Field | Type | Required | Description |
|---|---|---|---|
limit | integer | no | Max pages to return. |
list_seo_tasksReturns the agent's SEO tasks for this workspace (the plan board). Filter by status or type. Statuses: proposed (awaiting approval), approved, in_progress, verifying (maturing), verified/ineffective/regressed/inconclusive (settled), done, dismissed, obsolete.
| Field | Type | Required | Description |
|---|---|---|---|
status | string | no | Only return tasks in this status. Leave empty for all.proposed · approved · in_progress · verifying · verified · ineffective · regressed · inconclusive · done · dismissed · obsolete · completed |
type | string | no | Task type, e.g. ctr_fix |
limit | integer | no | Max tasks to return (default 15). |
get_seo_taskReturns full detail + execution history of one agent task: rationale, impact estimate, evidence, dependencies, and the latest execution actions. Also the way to check whether an executed task finished. For executed work it returns changeReceipt: the exact BEFORE and AFTER of every field the agent changed (…
| Field | Type | Required | Description |
|---|---|---|---|
taskId | string | yes | The task id |
get_task_rollbackReturns what the pipeline can RESTORE for an executed task: every live edit stores the page's full pre-edit state (rollback_data) before writing. Call this FIRST whenever the user reports an agent edit removed, broke, or damaged something on a page - NEVER tell the user original content is lost without che…
| Field | Type | Required | Description |
|---|---|---|---|
taskId | string | yes | The executed task id |
score_draftReturns score a DRAFT (or any pasted content) for AI-search answerability BEFORE publishing: the same deterministic AI Search Score signals the publish gate runs (answer-first structure, citations, freshness, schema readiness...) with a 0-100 score, pass/warn/fail band, and per-signal fixes. Paste HTML or…
| Field | Type | Required | Description |
|---|---|---|---|
content | string | yes | The draft: HTML, or plain text/markdown (auto-wrapped) |
contentType | string | no | The draft's shape; drives intent-aware signal weights (default guide)guide · tutorial · listicle · review · roundup · comparison · case_study · research · opinion |
Bulk page programs, content sweeps, and blog authoring.
list_seo_campaignsReturns the agent's campaigns (coordinated multi-task initiatives) with status, per-status task counts, and - for bulk_edit/page_scale campaigns - the bulk state: wave progress, auto-pause reason (circuit breaker), launch-timing warning, rollback stats, and the latest replan verdict. Statuses: proposed | a…
| Field | Type | Required | Description |
|---|---|---|---|
status | string | no | Only return campaigns in this status. Leave empty for all.proposed · approved · active · paused · done · abandoned |
The library that powers programmatic pages.
find_page_set_patternsReturns kEYWORD RESEARCH FOR A PAGE SET (2026-10-07). Finds, in this site's real Search Console queries (and, with a seed, the keyword provider's suggestions around it), the templates people repeat with one slot that varies: 'signage {x}' with x = rotherham, barnsley...; '{x} vs quickbooks' with x = xero,…
| Field | Type | Required | Description |
|---|---|---|---|
seed | string | no | A head term to research with the keyword provider ('signage', 'orthodontist', 'accounting software'); costs a few credits. Omit for Search Console only. |
minEntities | integer | no | Smallest set worth showing (default 5). |
list_datasetsReturns the structured datasets available for programmatic pages: the curated public library (real, sourced, CC0 data) plus datasets this user created or forked. Returns each dataset's id, name, column names, row count and provenance. Use the id with propose_page_scale_campaign (rowSource 'library') or wit…
| Field | Type | Required | Description |
|---|---|---|---|
search | string | no | Filter by name/description, e.g. "cities", "comparison", "services" |
category | string | no | Filter by category, e.g. locations, software, health, restaurants, jobs |
list_page_projectsReturns the user's page and blog projects (the project wizard), newest first: id, name, type (pages, posts or a CMS post type), wizard step, status, generation status, delivery (cms or hosted), whether a CMS is connected, the attached dataset, the field count, whether the page fields hold a {{Column}} temp…
| Field | Type | Required | Description |
|---|---|---|---|
type | string | no | Only projects of this type, e.g. posts. |
get_dataset_rowsReads a sample of rows from a dataset, to see what the data actually looks like before using it. Returns the columns and up to 25 rows. Get the id from list_datasets first.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | The dataset id from list_datasets |
limit | integer | no | How many rows to sample (default 5) |
get_page_templateReturns the full details of one built-in page template: its sections, the dataset columns it requires, its example dataset, and its AI cost per page. Get the id from list_page_templates first.
| Field | Type | Required | Description |
|---|---|---|---|
templateId | string | yes | The template id from list_page_templates |
Crawl, analyze, audit, and inventory the site itself.
analyze_page_seoAnalyzes a webpage for SEO issues and return an SEO score (0-100) with issues ranked by impact: indexability first (HTTP errors, noindex in the meta tag or X-Robots-Tag header, a canonical pointing elsewhere), then what shows in results (title, meta description), then structure, images, links, struc…
| Field | Type | Required | Description |
|---|---|---|---|
url | string | yes | The full URL of the page to analyze |
crawl_pageCrawls a webpage and extract its SEO metadata including title, meta description, headings, word count, links, images, schema markup, and Open Graph tags. Use this to analyze any public URL.
| Field | Type | Required | Description |
|---|---|---|---|
url | string | yes | The full URL of the page to crawl must be https or http |
get_site_inventoryPages of the user's REAL site as synced from their CMS/crawl (title, meta, word count, structure). Filter by URL/title substring. Paginated.
| Field | Type | Required | Description |
|---|---|---|---|
query | string | no | Substring to match against page URL or title |
limit | integer | no | Max pages to return (default 100). |
offset | integer | no | Skip this many pages (for paging). |
site_auditReturns site-WIDE technical SEO audit: crawls up to 30 of the workspace's pages (from the synced page inventory, or pass specific urls) and aggregates cross-page issues a single-page check cannot see - duplicate titles and meta descriptions, missing metas, near-empty pages, noindex leaks (meta tag or X-Rob…
| Field | Type | Required | Description |
|---|---|---|---|
urls | string | no | Specific pages to audit (max 30). Omit to audit the newest pages from the synced inventory. |
limit | integer | no | How many inventory pages to crawl when urls is omitted (default 20). |
article_scoresReturns one blog article's scores, as the editor's score sidebar shows them: content (the composite, Structure 25% + Term Coverage 75%, with both sub-scores), ai_search (the AI Search Score and its signals, computed on save), structure (word, heading, paragraph and image counts against the competitor basel…
| Field | Type | Required | Description |
|---|---|---|---|
articleId | string | yes | The blog article id. |
kind | string | no | Default content.content · ai_search · structure · term |
device | string | no | The SERP baseline device (default desktop).desktop · mobile |
check_connectionReturns is ONE source connected yet? The poll after the user said they finished the connect step in the browser: connected true/false, the connect link again when it is not, and for Search Console whether a property is selected. Cost: FREE - reads stored status, no AI credits.
| Field | Type | Required | Description |
|---|---|---|---|
integration | string | yes | The source to check.cms · gsc · ga4 · google_ads · gbp |
dataset_column_jobProgress of a background column change (jobId from dataset_columns).
| Field | Type | Required | Description |
|---|---|---|---|
jobId | string | yes |
dataset_exportExports a dataset's rows as JSON or CSV text (up to 2000 rows per call; offset pages further). Same content as the dashboard's export.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
format | string | no | Default jsonjson · csv |
offset | integer | no | |
limit | integer | no |
dataset_getReturns one dataset in full: name, status (private, in_review, public), columns with types, row count, provenance and license. Public library datasets, your own, and datasets attached to this workspace's projects.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | The dataset id |
dataset_rowsRows of a dataset, 100 per page, keyset-paged: pass the nextCursor a previous page returned. Each row carries _rowId (for update_row and delete_rows) and _id (the rowPk for ai_fill targets).
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
cursor | integer | no | The nextCursor from the previous page; omit for the first |
limit | integer | no |
dataset_searchReturns full-text search inside a dataset: the matching cells (row order and column) for a query, as the grid's search box returns them.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
query | string | yes |
deep_audit_compareCompares two completed deep site audits: which issues are new, which were fixed and which persist, per issue type with example URLs, plus the score change. Defaults to the newest completed audit against the one before it. Reads stored runs only. Cost: FREE - crawls with SEOmatic's own crawler in the…
| Field | Type | Required | Description |
|---|---|---|---|
runId | string | no | The newer run (default: newest completed). |
baseRunId | string | no | The older run to compare against (default: the completed run before runId). |
deep_audit_listReturns the workspace's recent deep site audits, newest first: status, pages crawled, health score and issue counts by severity. History is kept for the last 10 runs (up to 90 days). Reads stored runs only. Cost: FREE - crawls with SEOmatic's own crawler in the background, no AI credits.
| Field | Type | Required | Description |
|---|---|---|---|
limit | integer | no | How many runs (default 10). |
deep_audit_statusRuns one action on this record: progress and results of a deep site audit. While it runs: status and progress (pages crawled, links checked). When it is done: the health score (0-100), counts by severity, and every issue type found with its total and a few example URLs. Pass issueType to drill into one issue type and page through…
| Field | Type | Required | Description |
|---|---|---|---|
runId | string | no | The audit run id from deep_audit_start (default: newest). |
issueType | string | no | Drill into one issue type (as listed in the results).page_4xx · page_5xx · fetch_failed · redirect_loop · redirect_chain · broken_internal_link · internal_link_to_redirect · canonical_to_non_200 · canonical_other_host · canonicalised · noindex_in_sitemap · noindex_page · missing_title · duplicate_title · title_too_long · title_too_short · missing_meta_description · duplicate_meta_description · meta_description_too_long · meta_description_too_short · missing_h1 · multiple_h1 · duplicate_h1 · near_empty_page · thin_page · slow_ttfb · images_missing_alt · hreflang_missing_return · hreflang_to_broken · mixed_content · sitemap_blocked_by_robots · sitemap_non_200 · orphan_page · deep_page |
page | integer | no | Drill-down page number (default 1). |
pageSize | integer | no | Drill-down page size (default 25, max 100). |
estimate_costReturns what a tool call will cost BEFORE you make it, and what is left: the billing kind (free, credits at actual vendor cost, credits, or a prepaid unit), the credit ceiling the product reserves, and the remaining balance (plus free questions left on the free plan). Pass the tool and action you plan to c…
| Field | Type | Required | Description |
|---|---|---|---|
tool | string | yes | The tool you plan to call, e.g. keyword_research or run_ai_visibility_scan. |
action | string | no | Its action, for consolidated tools (e.g. metrics). |
units | integer | no | How many units the call covers when it scales, e.g. keyword batches. |
taskId | string | no | task_manage execute: the task to estimate. |
get_client_reportReturns the monthly client report for this workspace, as the reports portal shows it: view summary (the month's numbers, changes made, what is next), search (per-query and per-page Search Console detail), or work (the full history of changes). month as YYYY-MM, default the latest.
| Field | Type | Required | Description |
|---|---|---|---|
view | string | no | summary · search · work |
month | string | no | YYYY-MM |
get_competitor_top_pagesReturns a domain's top pages by estimated monthly organic traffic in a market: per page, estimated traffic, how many keywords it ranks for, how many in the top 3 and top 10, and keywords gained or lost recently. Use to see which pages earn a competitor's traffic.
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | yes | The domain to analyze (e.g., "competitor.com") |
limit | integer | no | Max pages to return (1-500, default 50). |
location_code | number | no | Location code (default: the site's own market). |
language_code | string | no | Language code (default: the site's own language). |
get_ga4_realtimeReturns gA4 realtime report: activity in the last 30 minutes (default: active users by page or screen). Realtime takes its own dimension set (unifiedScreenName, country, city, deviceCategory, platform, eventName, minutesAgo) and metrics (activeUsers, eventCount, keyEvents, screenPageViews), up to 4 dimensi…
| Field | Type | Required | Description |
|---|---|---|---|
dimensions | string | no | Realtime dimension API names (default unifiedScreenName). |
metrics | string | no | Realtime metric API names (default activeUsers). |
filters | string | no | Dimension filters, all applied together. |
limit | integer | no |
get_key_eventsReturns gA4 key events (what GA4 calls conversions since 2024) by landing page, source / medium or channel: key events, sessions and the session key event rate, optionally for one key event name. Zero key events usually means none are marked in GA4 (Admin > Events > Mark as key event).
| Field | Type | Required | Description |
|---|---|---|---|
by | string | no | Group by landing page (default), source / medium, or channel.landing_page · source · channel |
eventName | string | no | One key event name (e.g. purchase, generate_lead); omit for all. |
days | integer | no | |
limit | integer | no |
get_new_lost_backlinksLists INDIVIDUAL backlinks a domain gained or lost since a date (default the last 30 days): linking page, linking domain and its rank, target page, anchor text, follow or nofollow, first and last seen. New = live links first seen since the date; lost = links no longer found, last seen since the date…
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | yes | The domain to analyze (e.g., "example.com") |
status | string | no | new (default) or lost links.new · lost |
since | string | no | YYYY-MM-DD; default 30 days ago. |
perDomain | boolean | no | true = one link per referring domain. |
limit | integer | no | Max links to return (1-500, default 100). |
get_page_projectReturns one page project in detail: its fields (the template columns, with the {{Column}} template each holds), and its pages (id, title, slug, status, published URL) paged by status; pass pageId to read one page in full (every field value). Cost: FREE - reads stored data, no AI credits.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | From list_page_projects. |
pageId | string | no | One page in full instead of the page list. |
status | string | no | Page list: only pages in this status.draft · ready · in_progress · published · error · pr_staged · deploying |
limit | integer | no | |
page | integer | no | Page list: page number (default 1). |
get_page_speedRuns Google PageSpeed Insights on one public URL now (mobile or desktop): LAB metrics from a Lighthouse load (performance score, LCP, CLS, TBT, FCP, Speed Index) and FIELD data from real Chrome users over the last 28 days (LCP, INP, CLS at the 75th percentile, with Google's good / needs improvement…
| Field | Type | Required | Description |
|---|---|---|---|
url | string | yes | The full public URL (http or https) to measure. |
strategy | string | no | mobile (default, what Google ranks on) or desktop.mobile · desktop |
get_rank_historyReturns weekly Search Console position history for specific queries (default: the workspace's target terms, else its top queries by impressions): position, clicks, impressions and CTR per week, with the change from the first to the latest week. Position is Google's impression-weighted weekly average, not o…
| Field | Type | Required | Description |
|---|---|---|---|
queries | string | no | Up to 20 exact search queries. Omit for the target terms (or the top 10 queries by impressions when none are set). |
weeks | integer | no | How many complete weeks back (2-52, default 12). |
get_rank_moversReturns the biggest weekly Search Console position gains and losses between two weeks (default: the latest stored week against the week before), for queries or pages, judged only where both weeks have enough impressions. Also lists what newly entered or left the stored top 500. Position is an impression-we…
| Field | Type | Required | Description |
|---|---|---|---|
dimension | string | no | Compare queries (default) or pages.query · page |
fromWeek | string | no | Earlier week, any date in it (YYYY-MM-DD; snapped to its Monday). Default: the week before toWeek. |
toWeek | string | no | Later week, any date in it (YYYY-MM-DD; snapped to its Monday). Default: the latest complete stored week. |
minImpressions | integer | no | Minimum impressions in BOTH weeks for a move to count (default 20). |
limit | integer | no | Rows per list (1-50, default 15). |
get_serp_historyReturns true results-page history for one of the site's own queries (a target term or a query from its Search Console history): who held the top 10 each week, where this site ranked, and when a competitor changed its title and how its position moved after. Available for weeks SEOmatic fetched that results…
| Field | Type | Required | Description |
|---|---|---|---|
query | string | yes | The search query. Must be one of the site’s target terms or a query in its Search Console history. |
weeks | integer | no | How many weeks back (2-52, default 12). |
list_proof_linksReturns the workspace's proof certificate links (kind search: the search-lift certificate; ai: the AI-visibility certificate): path, domain, date, views, whether public. Admin or owner.
| Field | Type | Required | Description |
|---|---|---|---|
kind | string | no | Default searchsearch · ai |
note_cant_do_yetReturns record a request the SEOmatic agents cannot do yet, so the team can build it; the person hears when it ships. Call it only when no tool can do what they asked. Returns the exact sentence to tell them. Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
topic | string | yes | A short, plain name for what they want, reused for the same need: "Manage Google Ads bids", "Write social posts from articles". |
request | string | yes | The person's request, in their own words. |
closest | string | no | The closest thing the agents CAN do, if any. |
project_exportExports a project's pages (or one page with pageId) as CSV or JSON, as the grid and editor do: the file name, the dashboard download link (opens in a signed-in browser), and the file content when it is small. Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
pageId | string | no | |
format | string | no | csv · json |
status | string | no | ready · published · draft · error |
project_generation_runReturns the telemetry of one generation run (stages, events, credits): by runId, or the newest run for a subjectId (a page, keyword or row id), optionally on one surface (preview, wizard, chat, agentic).
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
runId | string | no | |
subjectId | string | no | |
surface | string | no |
project_jobReturns result of a preview, spin-syntax or template-render job (jobId from project_preview, project_spin_content or project_save_field_values applyJobs): running, done with the result, or failed.
| Field | Type | Required | Description |
|---|---|---|---|
jobId | string | yes | |
projectId | string | no |
project_keywordsReturns a blog project's keywords (the article topics): keyword, metrics status, volume, difficulty; filter by status or search, 500 max per page.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
status | string | no | pending · processing · completed · failed · no_data |
search | string | no | |
limit | integer | no | Default 50 |
page | integer | no |
project_pages_gridReturns the Pages grid: dataset rows joined to the page each row drives (status, published URL, overrides), keyset-paged by cursor; the first page also carries the total and the pages without a row.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
cursor | integer | no | |
limit | integer | no | Default 100 |
project_validate_fieldsReturns whether every required field of the project is filled (what blocks the wizard's final step), with the missing ones.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes |
query_search_analyticsReturns flexible Search Console query: up to 3 dimensions (query, page, country, device, date, searchAppearance), filters (equals, notEquals, contains, notContains, includingRegex, excludingRegex) on query/page/country/device/searchAppearance, any search type (web, image, video, news, discover, googleNews)…
| Field | Type | Required | Description |
|---|---|---|---|
dimensions | string | no | 1-3 dimensions to group by (default query).query · page · country · device · date · searchAppearance |
filters | string | no | Filters, all applied together (AND). Regex is RE2. Country is a 3-letter code (usa, fra); device is DESKTOP, MOBILE or TABLET. |
searchType | string | no | web · image · video · news · discover · googleNews |
dataState | string | no | final (default) = finalized data; all = includes fresh data from the last 2-3 days, which can still change.final · all |
startDate | string | no | YYYY-MM-DD, with endDate. Overrides days. |
endDate | string | no | YYYY-MM-DD, with startDate. |
days | integer | no | Days back from the latest available day when no dates are given (default 28, up to ~16 months). |
rowLimit | integer | no | Rows per page (1-25,000, default 1,000). |
startRow | integer | no | Zero-based row offset for paging (use nextStartRow). |
aggregationType | string | no | auto (default), byPage or byProperty. byProperty cannot be used with the page dimension or a page filter.auto · byPage · byProperty |
run_ga4_reportReturns custom GA4 report by Data API names: up to 9 dimensions and 10 metrics (e.g. sessionDefaultChannelGroup, landingPage, pagePath, deviceCategory, country, customEvent:<parameter>; sessions, totalUsers, engagementRate, keyEvents, totalRevenue), up to 4 date ranges, dimension filters (string match or i…
| Field | Type | Required | Description |
|---|---|---|---|
dimensions | string | no | Dimension API names (0-9). |
metrics | string | yes | Metric API names (1-10). |
dateRanges | string | no | Up to 4 ranges; dates are YYYY-MM-DD, today, yesterday or NdaysAgo. Overrides days. |
days | integer | no | Days back ending yesterday when no dateRanges (default 28). |
filters | string | no | Dimension filters, all applied together: field + value (with matchType, default exact) or values (in-list); not:true excludes matches. |
orderBys | string | no | Sort by requested metrics or dimensions (default: first metric, descending). |
limit | integer | no | Rows per page (1-10,000, default 100). |
offset | integer | no | Row offset for paging. |
switch_workspaceReturns the steps to connect this assistant to another workspace (by id, name or site), since one connection is bound to one workspace: the server URL and the approval screen for OAuth clients, the API keys page for key-based clients. Changes nothing by itself; the user completes a browser step. Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
workspace | string | yes | The workspace id, name or site host from list_workspaces. |
validate_structured_dataValidates a page's structured data against Google's rich-result rules: fetches the URL (or takes pasted JSON-LD), parses every JSON-LD block (including @graph and @id references), and reports parse errors, missing REQUIRED properties (not eligible), missing RECOMMENDED properties (weaker result), an…
| Field | Type | Required | Description |
|---|---|---|---|
url | string | no | A public page URL to fetch and validate. |
jsonld | string | no | Raw JSON-LD to validate instead of a URL: a JSON document, or <script type="application/ld+json"> blocks. |
An action lets a Zap do something in SEOmatic. Every action that touches your content is proposal-based and approval-gated: SEOmatic drafts the work, a human approves it. Nothing is applied silently.
Some actions only read. Zapier requires every search to take at least one input, so the read tools that take none (the Find ... actions such as Find SEO Snapshot or Find Credit Usage, and List Page Templates) are listed as actions. They return data and change nothing.
add_project_fieldAdds one field (template column) to a page project, as the wizard does: label, type, category and options; the CMS key is derived from the label unless fieldName is given. Appends after the last field unless order is given. Member or above. Cost: FREE - saves project settings, no AI credits.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
label | string | yes | |
fieldName | string | no | The CMS key; derived from the label when absent. |
type | string | yes | single_line · multiline · rich_text · email · number · image_url · link · dropdown · multiselect · creatable_multiselect · switch · date · datetime · phone · boolean · toggle · image · color · file · video · json · multi_image · rules |
category | string | no | required · optional · acf · meta · advanced |
placeholder | string | no | |
helpText | string | no | |
isRequired | boolean | no | |
maxLength | integer | no | |
options | string | no | dropdown / multiselect / creatable_multiselect choices. |
order | integer | no |
add_project_keywordsAdds keywords to one of the workspace's BLOG projects (the article keyword list the dashboard's Keywords tab manages): the rows are created and their search volume, difficulty, intent and trend are fetched in the background by the keyword worker. Caps are the dashboard's: up to 100 keywords per call…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | The blog project |
keywords | string | yes | 1 to 100 keywords |
locationCode | integer | no | Locale location code (default: the workspace market) |
languageCode | string | no | Two-letter language code (default: the workspace market) |
add_tracked_promptAdds a tracked prompt to the AI-visibility monitor - a question future scans will ask every engine (e.g. 'best invoicing software for freelancers'). Plan-capped: at the plan's limit the refusal says which plan raises it. Cost: adding is FREE; each active prompt increases the recurring scan cost when…
| Field | Type | Required | Description |
|---|---|---|---|
prompt | string | yes | The buyer question to track, in the customer voice |
locationCode | integer | no | Locale location code (default: the primary monitor locale) |
languageCode | string | no | Locale language code, e.g. "en" |
article_auto_optimizeReturns auto Optimize for one blog article, as the editor's button does: suggestions that close the term and structure gaps against the competitors (English articles only; the writer applies them). op start: without confirm it returns the credit estimate; with confirm: true it starts the run and returns a…
| Field | Type | Required | Description |
|---|---|---|---|
articleId | string | yes | The blog article id. |
op | string | yes | start · status |
jobId | string | no | status only: the jobId start returned. |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
article_feedbackReturns record the user's verdict on one blog article, as the editor's thumbs do: like, dislike, or null to clear it. Only the user's own verdict. Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
articleId | string | yes | The blog article id. |
feedback | string | yes | like, dislike, or null to clear.like · dislike |
brand_autofillReads the workspace's connected website into its brand (voice, company profile, colours and logo), as the Brand page's Read my site does: only EMPTY fields are filled, the user's edits are kept. op start: without confirm the credit estimate; with confirm: true a job id (admin or owner; 20 reads an h…
| Field | Type | Required | Description |
|---|---|---|---|
op | string | no | Default start.start · status |
jobId | string | no | status only (required). |
confirm | boolean | no | Must be true only after the user explicitly said yes to THIS action in this conversation; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
brand_copyReturns copy the brand style from another workspace of the same organization the user can open (the voice's tone, rules and words, and the colours and fonts). This workspace's company facts, references and logo stay. It replaces this workspace's voice style and kit, so it needs confirm: true after the user…
| Field | Type | Required | Description |
|---|---|---|---|
sourceWorkspaceId | string | yes | The workspace to copy from (the workspaces tool lists them). |
confirm | boolean | no | Must be true only after the user explicitly said yes to THIS action in this conversation; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
brand_kitReturns the workspace's visual brand kit (colours, fonts, logo URL, visual style notes) the image writers use. op get reads it; op set saves the fields passed, validated like the Brand page (hex colours), with confirm: true after the user's yes. Logo files are uploaded on the Brand page. Member or above to…
| Field | Type | Required | Description |
|---|---|---|---|
op | string | yes | get · set |
kit | string | no | set only (required): the fields to save. |
confirm | boolean | no | Must be true only after the user explicitly said yes to THIS action in this conversation; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
brand_voice_referencesReturns a brand voice's reference materials (pages and notes the writers learn the voice from). op list, add (type url reads a public page; type text saves a note; up to 50 per voice), delete (referenceId). Files are uploaded on the Brand page. Member or above. Cost: FREE - no AI credits.
| Field | Type | Required | Description |
|---|---|---|---|
voiceId | string | yes | From brand_voices list. |
op | string | yes | list · add · delete |
type | string | no | add only (required): url or text.url · text |
url | string | no | add, type url: the page. |
content | string | no | add, type text: the note. |
title | string | no | add: a title. |
referenceId | string | no | delete only (required): from op list. |
brand_voicesReturns the workspace's brand voices, as the Brand page edits them. op list (newest first; the first is the voice the agents write in), create (name required), update (voiceId; only the fields passed change). Members create and update. Cost: FREE - no AI credits.
| Field | Type | Required | Description |
|---|---|---|---|
op | string | yes | list · create · update |
voiceId | string | no | update (required): from op list. |
voice | string | no | create / update: the voice fields (name, description, toneFormality/toneHumor/toneRespect/toneEnthusiasm 1-5, structuralRules, approvedTerms, bannedTerms, carefulTerms, dos, donts, pointOfView, customInstructions, language, copyBank, excludedTopics,… |
connection_statusReturns what this workspace has connected and what it has not: the website/CMS, Google Search Console (plus the selected property), Google Analytics, Google Ads and Google Business Profile. Every unconnected source carries its connect link, bound to this workspace (a one-time browser step; after it the sou…
No input fields. It runs on the connected workspace.
create_bulk_edit_campaignStages ONE bulk sweep campaign that applies an instruction across MANY pages (e.g. "rewrite every meta title to include the current year", "add alt text to all images sitewide") - up to 500 pages, one approve-once campaign, one per-page task each (full per-page safety: reviewer gate, money-page prot…
| Field | Type | Required | Description |
|---|---|---|---|
taskType | string | yes | What the sweep rewrites on every pagectr_fix · striking_distance · og_tags · alt_text · freshness_stamp · heading_fix · faq_block · schema_repair · schema · content_refresh · eeat_enrichment · broken_link_fix · geo_enrichment · author_schema · internal_links · index_request · cwv_fix |
instruction | string | no | The shared brief every page rewrite follows (required unless segments[] is provided) - be specific |
title | string | no | A name for this sweep, shown on the agent board. |
selectorKind | string | no | Single-segment sweeps: how to pick the pages - an explicit URL list, every inventory page under a path prefix, or the whole synced site inventory. Omit when using segments[].urls · path_prefix · all_pages |
urls | string | no | Required when selectorKind=urls |
pathPrefix | string | no | Required when selectorKind=path_prefix, e.g. /blog |
segments | string | no | Mixed-template sweeps: per-section selector + instruction (overrides selectorKind/instruction) |
maxPages | integer | no | Safety cap on how many pages the sweep may touch. |
create_seo_tasksStages up to 5 SEO tasks in the agent's plan as PROPOSALS. This NEVER executes anything: each staged task renders a card where the user approves and optionally runs it through the agent's gated pipeline (safety review, money-page protection, rollback). Check list_seo_tasks first to avoid duplicates.…
| Field | Type | Required | Description |
|---|---|---|---|
taskType | string | yes | What kind of work to propose. content_create takes a topic; the others take a page URL.content_create · content_refresh · ctr_fix · striking_distance · internal_links · technical · schemaDefault: content_create |
target | string | yes | The full page URL to improve, or, for content_create, the topic to cover. |
title | string | yes | The goal in plain words, e.g. "Get the pricing page onto page 1 for 'seo tool pricing'". |
rationale | string | yes | Why this work is worth doing. Shown on the approval card your team reviews. |
queries | string | no | Optional. The Google search queries this work should win (required for ctr_fix and striking_distance). |
campaignTitle | string | no | Optional. Name a campaign to group this task under one initiative on the agent board, e.g. "Q4 content push". Leave empty to stage it as a standalone task. |
campaignType | string | no | Only used when Group Under Campaign is set. topic_cluster = build coverage on a topic; refresh_sweep = update decaying content; ctr_sweep = improve titles and snippets; technical_pass = technical fixes; internal_link_architecture = interlinking; single_fix = anything else.topic_cluster · refresh_sweep · ctr_sweep · technical_pass · internal_link_architecture · single_fixDefault: single_fix |
dataset_add_fill_columnAdds a data column to a project's dataset and fill it with AI for every row (the "enrich" move). Bills AI credits: without confirm it returns the estimate; with confirm: true it adds the column and starts the fill job (poll dataset_ai_job).
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
columnName | string | yes | |
prompt | string | yes | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_add_rowsReturns append rows the USER provided (up to 500) to a dataset you own, or to a project's own dataset (pass projectId). Values are the user's data, never invented. Over 100 rows needs confirm: true after the user's yes.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
rows | string | yes | |
projectId | string | no | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_ai_fillReturns fill chosen cells of a project's dataset (or page fields) with AI from a prompt, as the Pages grid does. Targets: rowPk (the _id from dataset_rows) + columnKey. Bills AI credits: without confirm it returns the estimate; with confirm: true (the user's explicit approval) it starts a job to poll with…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
prompt | string | yes | |
targets | string | yes | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_ai_jobProgress of an AI fill or row-generation job (op status), or stop it (op cancel). jobId from dataset_ai_fill, dataset_add_fill_column or dataset_generate_rows.
| Field | Type | Required | Description |
|---|---|---|---|
op | string | yes | status · cancel |
projectId | string | yes | |
jobId | string | yes |
dataset_attachReturns attach an existing dataset (public, or the user's own) to a project by reference, with the wizard's compatibility warnings: template columns the data lacks, {{tokens}} no column resolves, and duplicate rows (reported, never removed). Attaching replaces the project's own dataset, which is deleted: t…
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
projectId | string | yes | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_bulk_updateSets many cells at once (up to 2000): rowId + columnId (the column name) + value, as a multi-cell paste in the grid does. Needs confirm: true after the user's yes.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
updates | string | yes | |
projectId | string | no | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_columnsRuns one action on this record: add, rename or delete a column. Renaming (templates using the old name stop filling) and deleting (DESTRUCTIVE) need confirm: true after the user's explicit yes. Datasets over 20,000 rows run the change as a background job: poll dataset_column_job with the returned jobId.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
op | string | yes | add · rename · delete |
columnName | string | no | add/delete: the column; rename: the current name |
newName | string | no | rename only |
columnType | string | no | add only, default single_line |
defaultValue | string | no | add only |
projectId | string | no | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_copyReturns copy a public (or accessible) dataset into the user's own library, unattached to any project. Needs confirm: true after the user's yes.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_createCreates a dataset from rows the USER gave (never invented): columns plus up to 500 row objects. With projectId it is attached to that project (the wizard's import), replacing the project's own dataset: that one is deleted, so it then needs an admin or the owner and confirm: true after the user's yes…
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | |
columns | string | yes | |
rows | string | yes | |
projectId | string | no | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_deleteDeletes a dataset, or with projectId detach it from that project (a shared library dataset is only unlinked; the project's own private dataset is deleted, published pages kept). DESTRUCTIVE and admin-only: needs the user's explicit yes (confirm: true).
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
projectId | string | no | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_delete_rowsDeletes rows (by _rowId) from a dataset. DESTRUCTIVE: needs the user's explicit yes (confirm: true) after seeing which rows. Never use it to remove duplicate rows on your own; the user decides.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
rowIds | string | yes | |
projectId | string | no | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_find_replaceRuns one action on this record: find and replace text across a project's dataset as a background job (op start), then poll (op status) or stop it (op cancel). Needs projectId: the dataset must be the project's own, not a shared library copy. op start needs confirm: true after the user's yes.
| Field | Type | Required | Description |
|---|---|---|---|
op | string | yes | start · status · cancel |
projectId | string | yes | |
datasetId | string | yes | |
findText | string | no | start: required |
replaceText | string | no | start: default empty |
matchCase | boolean | no | |
matchWholeWord | boolean | no | |
selectedCells | string | no | start: limit to these cells |
jobId | string | no | status/cancel: required |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_forkReturns make a private, editable copy of a dataset for a project (copy-on-write for shared library datasets). The copy is attached to the project. Needs confirm: true after the user's yes.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
projectId | string | yes | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_generate_rowsGenerates NEW rows for a project's dataset from a prompt ("every US state") into one data column, as the grid's Generate rows does. Bills AI credits: without confirm it returns the estimate; with confirm: true it starts the job (poll dataset_ai_job). Use only when the user asked for AI-generated row…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
prompt | string | yes | |
columnKey | string | yes | The data column the values land in |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_restore_snapshotReturns restore a project dataset to an earlier snapshot (the grid's undo/redo): replaces ALL its rows (and the columns, when columnSchema is passed) with the rows given, e.g. a dataset_export taken before. Overwrites the current rows, so it needs the user's explicit yes (confirm: true). Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
datasetId | string | yes | |
data | string | yes | |
columnSchema | string | no | |
confirm | boolean | no | |
confirmDestructive | boolean | no |
dataset_update_metadataReturns rename a dataset the user owns or change its description, category or tags.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
title | string | no | |
description | string | no | |
category | string | no | |
tags | string | no |
dataset_update_rowReturns change cells of one row (by _rowId from dataset_rows). merge (default true) writes only the given cells; merge false replaces the whole row.
| Field | Type | Required | Description |
|---|---|---|---|
datasetId | string | yes | |
rowId | string | yes | |
data | string | yes | |
merge | boolean | no | |
projectId | string | no |
decide_seo_taskRuns one action on this record: approve or dismiss a STAGED task proposal. This is the human half of the approval loop (pairs with the task.awaiting_approval webhook event, so a decision can happen from Slack or any workflow instead of the dashboard). Approving releases the task to the agent's gated pipeline - auto-executable sta…
| Field | Type | Required | Description |
|---|---|---|---|
taskId | string | yes | The task id (from list_seo_tasks or the task.awaiting_approval event) |
decision | string | yes | approve releases the task to the agent for execution through its gated pipeline; dismiss archives it.approve · dismiss |
confirmDestructive | boolean | no | Required true to APPROVE an indexation-destructive type (noindex, redirect). Attestation that a human explicitly confirmed this specific task after seeing its URL and consequence - never set it on your own judgment. |
deep_audit_cancelReturns stop a queued or running deep site audit. A running audit stops after its current batch and keeps what it found so far (status cancelled). Changes nothing on the site. Cost: FREE - crawls with SEOmatic's own crawler in the background, no AI credits.
| Field | Type | Required | Description |
|---|---|---|---|
runId | string | yes | The audit run id to stop. |
deep_audit_startReturns start a deep technical SEO audit of the workspace's own site: a background crawl from the homepage, the sitemap and the synced page inventory (default 500 pages, max 2000) that checks status codes, redirect chains and loops, broken internal links, canonicals, noindex pages in the sitemap, titles, m…
| Field | Type | Required | Description |
|---|---|---|---|
maxPages | integer | no | Most pages to crawl (default 500, max 2000). |
urls | string | no | List mode: audit exactly these pages of the workspace site, following no links. Omit to crawl the whole site. |
edit_project_fieldReturns change one field's label (the CMS key follows it), help text, placeholder or options, as the wizard does. Only the properties passed change. Member or above. Cost: FREE - saves project settings, no AI credits.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
fieldId | string | yes | From get_page_project. |
label | string | no | |
helpText | string | no | |
placeholder | string | no | |
options | string | no | dropdown / multiselect / creatable_multiselect choices. |
edit_project_pageSaves one page's field values, as the page editor's Save does: pass the fieldValues object in the shape get_page_project returns (keyed by field id, each { value, category, fieldName }); the page keeps what you do not pass. Changes the stored page only; a published page changes on the live site when…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
pageId | string | yes | |
fieldValues | string | yes | Field values keyed by field id, as get_page_project returns them. |
get_agent_settingsReturns the workspace's agent controls: enabled (on/off), autonomyMode (approval: a human approves every task; assisted: bounded reversible tasks run on their own; auto: low-risk campaigns run automatically within the daily credit cap), dailyCreditCap and today's spend against it, the publish-gate floors a…
No input fields. It runs on the connected workspace.
get_ai_funnelReturns the full AI-search funnel per page of the user's site, joined across three measurements nobody else holds together: CITED (engines named the page as a source in tracked answers), CRAWLED (answer-time/indexing AI bots actually fetched it), REFERRED (GA4-measured assistant-referred visitors landing o…
No input fields. It runs on the connected workspace.
get_brand_factsReads the canonical business facts this site publishes for AI answer engines (name, legal name, founding year, founders, description, contact, official profiles) plus its internal-link health reading. The facts are the site's declared ground truth, published as Organization structured data by the SE…
No input fields. It runs on the connected workspace.
get_brand_profileReturns the workspace's brand profile as the Brand page shows it: company name, description, industry, elevator pitch, target audience and products, plus the brand voices (newest first; the first is the voice the agents write in). Empty fields mean the writers work without that fact. Cost: FREE - reads sto…
No input fields. It runs on the connected workspace.
get_credit_usageReturns where this workspace's AI credits went in the current billing period: customer-language groups (items) AND the raw per-feature ledger with event counts (features) - the per-agent/per-action granularity an integration needs. Total reconciles with the plan meter. Free operations are listed explicitly…
No input fields. It runs on the connected workspace.
get_fresh_performanceReturns today-and-yesterday search performance using GSC's fresh (provisional) data - hours old instead of the 2-3 day finalized lag. Numbers can still shift; use for "how is today going", never for reporting.
No input fields. It runs on the connected workspace.
get_referral_linkReturns the user's personal SEOmatic Refer and earn link and earnings. Returns: shareUrl (their /r/ link), totalReferred, converted (became paying), and earnings per currency (pending, ready, paid, in minor units). The offer: the referrer earns 25% of what each customer they bring pays, for 12 months, up t…
No input fields. It runs on the connected workspace.
get_seasonality_baselineReturns sixteen months of monthly performance with a year-over-year verdict: answers "is this drop a real loss or just my normal seasonal dip?" Use BEFORE alarming anyone about a traffic change.
No input fields. It runs on the connected workspace.
get_seo_snapshotReturns compact brief of the SEO agent's cached signals for this workspace (site inventory, GSC performance, GEO gaps, content scores, open questions). Read this before proposing SEO work.
No input fields. It runs on the connected workspace.
get_seo_strategyReturns the agent's current SEO strategy for this workspace: strategic themes, ranked big plays, rationale, baseline metrics, freshness. Read it before discussing priorities or proposing new work.
No input fields. It runs on the connected workspace.
get_sitemaps_statusReturns health of every sitemap submitted to Search Console: errors, warnings, pending processing, stale downloads, and submitted counts. First stop for "Google is not indexing my pages".
No input fields. It runs on the connected workspace.
get_slack_settingsReturns how this workspace notifies the team in Slack: whether Slack is connected and to which team, the card mode (each = one card per decision, digest = one message per burst), the weekly report and mention switches, and the channel this site posts to (its own route or the default). Organization owner on…
No input fields. It runs on the connected workspace.
get_trust_entitiesReturns the trust entities AI engines consult when answering questions about the user's market, mined from the ACTUAL fan-out queries our scans capture (site:-scoped searches + review platforms / analysts like G2, Gartner, Reddit). Every entity carries the honest cross: queried AND cited, or queried-but-ne…
No input fields. It runs on the connected workspace.
get_trust_factsReturns the workspace's TRUST PROFILE: the provenance-tracked, verifiable business facts (credentials, years of experience, awards, review counts, guarantees) the agent's writers are allowed to claim in E-E-A-T work. Each fact carries its source URL and whether the customer confirmed it. When this list is…
No input fields. It runs on the connected workspace.
import_attachment_as_datasetPromotes a spreadsheet the user uploaded IN THIS CONVERSATION (CSV/Excel - its preview carries an attachmentId) into a private dataset in their library. Call it when the user wants the file used as campaign data (pages-at-scale rows, bulk targets) or asks to save it as a dataset - the returned id th…
| Field | Type | Required | Description |
|---|---|---|---|
attachmentId | string | yes | The attachmentId shown in the uploaded file preview |
name | string | no | Dataset name (defaults to the file name) |
datasetType | string | no | 'search_console_ai_pages' for the Pages export of Search Console's generative AI performance reportsearch_console_ai_pages |
dateRange | string | no | Required with search_console_ai_pages: the date range the user exported, as shown in Search Console. Never guess it. |
list_page_templatesReturns the built-in page templates of the project wizard (read-only reference). Returns each template's id, what it's for, the dataset columns it requires, and its AI cost per page. They cannot be used from chat: a page set proposed from chat is built on the user's own page or own project template.
No input fields. It runs on the connected workspace.
list_protected_pagesReturns the workspace's protected (money) pages: URLs, or /path/* prefixes, the agent may never change unattended; every edit to them is staged for the user's approval. With the reason each was listed.
No input fields. It runs on the connected workspace.
list_slack_channelsReturns the Slack channels SEOmatic can post decision cards to (public channels, plus private ones the app was invited to; archived and externally shared channels are excluded), with the channel this site currently uses. Organization owner only, as in Settings. Cost: FREE.
No input fields. It runs on the connected workspace.
list_workspacesReturns every workspace (site) the user can access: name, id, site, plan, and which one this connection is bound to. A connection serves one workspace; use switch_workspace for the steps to work on another. Cost: FREE - reads stored data, no AI credits.
No input fields. It runs on the connected workspace.
manage_campaignRuns one action on this record: approve, pause, resume, update the brief of, or abandon one of the agent's campaigns ON THE USER'S BEHALF - never send the user to the dashboard for these. approve: proposed → approved, releasing the campaign's tasks to the execution queue (bulk campaigns release wave 1 only; spend consent = the ca…
| Field | Type | Required | Description |
|---|---|---|---|
campaignId | string | yes | The campaign to manage. Map the id from a List SEO Campaigns step. |
action | string | yes | pause / resume / abandon the campaign, or update_brief to change its brief.approve · pause · resume · abandon · update_brief |
confirm | boolean | no | Required true for approve and abandon: attests the user explicitly asked for this (approve releases work + spend; abandon is irreversible). |
confirmDestructive | boolean | no | The same attestation as confirm, as the confirm widget and the elicitation retry send it. |
brief | string | no | update_brief only: the FULL replacement brief the template will be re-authored from. Enrich with concrete substance (sections, specifics, FAQs); the thin-content floor (500 rendered words) is a hard bar, never loosened. |
project_clear_fieldsReturns clear the project's setup content, as stepping back from step 3 of the wizard does: cancels generation, deletes every column and generated page, and the blog keywords (posts) or private datasets (pages). Admin once pages are live. Needs the user's yes (confirm: true). Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_content_briefReturns edit a blog post's content brief (by contentBriefId): outline (heading + subheadings list), searchIntent, narrative, targetAudience, questionsToCover, callToAction, tone, articleLength, language, competitorUrls, requiredKeywords, primaryGoal, contentType.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
contentBriefId | string | yes | |
outline | string | no | |
updates | string | no | Other brief fields |
project_createCreates a page project (the wizard's first step): name, type (pages, posts or a CMS post type), templateType (seomatic, cms, custom) and an optional built-in pageTemplate (Scale+; a custom {{Column}} template works on any plan). Content Engine (custom) projects get a sample dataset, blog projects sa…
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | |
description | string | no | |
type | string | no | |
templateType | string | no | seomatic · cms · custom |
pageTemplate | string | no |
project_deleteDeletes a project and its unpublished pages. DESTRUCTIVE and admin-only: needs the user's explicit yes (confirm: true) after seeing the project name.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_delete_fieldDeletes one template column (Title and Slug cannot be deleted). Pages keep their stored values. Needs the user's yes (confirm: true). Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
fieldId | string | yes | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_delete_pagesDeletes pages of a project (one or many, the grid's Delete). removeFromCms also removes each published page from the CMS first (25 per call; the rest come back as deferredPageIds). Live pages need an admin. Needs the user's yes (confirm: true). Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
pageIds | string | yes | |
removeFromCms | boolean | no | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_duplicateReturns copy a project (fields, template, settings) under a new name.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
newName | string | no |
project_ensure_pageCreates the draft page behind one dataset row of the project if it has none (datasetRowPk = the row's _id); returns the page.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
datasetRowPk | string | yes |
project_generateGenerates the project's pages from its template and dataset (maxRows caps the batch). Bills AI credits per AI prompt per page: without confirm it returns the plan (rows, prompts, credits, and anything blocking: unknown {{tokens}}, missing template columns, the plan's page cap); with confirm: true (t…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
maxRows | integer | no | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_generate_postsWrites blog posts for keywords of a blog project (brief, long article, featured image each). Bills AI credits: without confirm it returns the estimate and anything blocking; with confirm: true (the user's explicit approval) it reserves the credits and starts the job (poll project_posts_generation).…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
keywordIds | string | yes | |
maxKeywords | integer | no | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_generationReturns the page generation job of a project: op status (progress, stage, errors), pause, resume, cancel (stops after the current batch), or retry (clears a failed job so a new generation can start).
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
op | string | yes | status · pause · resume · cancel · retry |
project_hostingReturns switch a project to SEOmatic-hosted delivery (op enable, Scale+: provisions the workspace's hosted site and detaches the CMS connection, so it needs confirm: true after the user's yes) or back to CMS delivery (op disable, any plan).
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
op | string | yes | enable · disable |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_keyword_refresh_baselineReturns rebuild a blog keyword's SERP baseline (the competitor targets the content scores compare against), the editor's Refresh baseline. Async: returns a jobId; scores show the new baseline when it lands. Bills AI credits: without confirm it returns the estimate. Cost: AI credits (estimate first).
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
keywordId | string | yes | |
device | string | no | desktop · mobile |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_keyword_retry_metricsFinds a blog keyword's metrics again after a failed or no-data fetch (the Keywords tab's Retry). Runs in the background. Cost: the metrics fetch uses the keyword data allowance like the first fetch.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
keywordId | string | yes |
project_posts_generationReturns the blog generation job of a project: op status (state, progress) or cancel.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
op | string | yes | status · cancel |
project_previewReturns render up to 3 preview pages from the project's template and data (the wizard's Preview). Bills AI credits when the template has AI prompts: without confirm it returns the estimate; with confirm: true it starts a job to poll with project_job.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_publishPublishes a project's pages or posts to its CMS: every ready page, or pageIds; at once or as a drip (batchSize per daily/weekly/monthly batch); as drafts where the CMS supports it. Counts against the plan's page quota. Starts a job; progress shows in project_pages statuses. Only after the user asked…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
pageIds | string | no | |
publishAsDraft | boolean | no | Default false |
drip | string | no | Omit to publish everything at once |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_publish_jobReturns a publish run started by project_publish: op status (progress, batches, next batch, governor hold) or cancel (stops the drip and closes an open GitHub wave pull request; confirm: true after the user's yes). A governor hold is resumed with resume_page_publishing. Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
jobId | string | yes | |
op | string | yes | status · cancel |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_regenerate_outlineWrites a new outline for a blog post's content brief with AI (4 to 6 sections), replacing the current one. Bills AI credits: without confirm it returns the estimate; with confirm: true it runs. Cost: AI credits (estimate first).
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
contentBriefId | string | yes | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_reorder_fieldsSets the order of template columns (the grid's drag and drop): each { id, order }, up to 100. Every id must be a column of this project. When pages are live it needs confirm: true after the user's yes. Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
fieldUpdates | string | yes | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_save_field_valuesSaves templates into project fields (field id -> value; {{Column}} tokens must match the dataset). Validated like the wizard. applyFieldIds (up to 20) re-renders every row for those fields (an AI render job per field, polled with project_job): when the templates have AI prompts that bills AI credits…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
fieldValues | string | yes | |
applyFieldIds | string | no | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_spin_contentAdds spin syntax ([a|b|c] variations) to a template's HTML text, as the editor's button does. Bills AI credits: without confirm it returns the estimate; with confirm: true it starts a job to poll with project_job (the result carries the spun HTML to save with project_save_field_values).
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
htmlContent | string | yes | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
project_sync_fieldsReturns pull the CMS's field schema into the project from one of this workspace's connections (postType names the post type, resource or collection where the CMS needs it).
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
connectionId | string | yes | |
postType | string | no |
project_updateReturns change a project's settings: name, description, type, templateType, currentStep (1-3), status, connectionId (this workspace's CMS connection), cmsCollectionId, pageTemplate (Scale+; null clears), blogSettings.internalLinkingStrategy.
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
name | string | no | |
description | string | no | |
type | string | no | |
templateType | string | no | seomatic · cms · custom |
currentStep | integer | no | |
status | string | no | draft · published |
connectionId | string | no | |
cmsCollectionId | string | no | |
pageTemplate | string | no | |
blogSettings | string | no |
propose_content_sweep_campaignStages a CONTENT SWEEP as a managed CAMPAIGN: N DISTINCT blog articles on N different topics, tracked on the agent board with a planning phase. Up to 50 topics, batched into ONE run of the blog pipeline. PREFER write_blog_articles for a plain "write N articles" ask - it validates first and needs one…
| Field | Type | Required | Description |
|---|---|---|---|
title | string | yes | A name for the sweep, shown on the agent board. |
topics | string | yes | One article per topic. Make them genuinely DISTINCT subjects - near-duplicate topics cannibalize each other, and the planning task will drop any the site already covers. |
brief | string | no | Editorial direction shared by every article: audience, angle, tone, what each piece must do. |
propose_location_pagesStages a batch of location pages built on the customer's own site, page type and layout. mode 'create': new pages modelled on one of their pages (exemplarUrl, ideally an existing location page): each new page keeps its layout, page type and embeds (videos, forms) unchanged, moves its Google Maps emb…
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | yes | create · enrich |
exemplarUrl | string | no | create: the customer's page the new pages are modelled on (its layout, embeds and page type). |
exemplarPlace | string | no | create: the place the model page is about, when its title does not say (e.g. "Dublin"). |
title | string | no | |
rows | string | yes | One object per location: name (required), and the facts the user gave: city, region, country, address, phone, email, hours, services[], areasServed[], mapUrl, productLine, notes[] (other facts), slug. enrich: pageUrl of the existing page. |
propose_page_scale_campaignStages a SET of pages built on the customer's OWN page or OWN template (e.g. "a page for each town we serve", "one page per product line"). We never design a page for them and never use a built-in design. Pass ONE of: exemplarUrl (one of their own pages, in their site inventory: the set is built by…
| Field | Type | Required | Description |
|---|---|---|---|
title | string | yes | A name for the campaign, shown on the agent board. |
kind | string | yes | What kind of pages, e.g. "location pages", "service area pages", "product line pages" |
brief | string | yes | What the user asked for, in their words: audience, what each page must say, tone |
exemplarUrl | string | no | One of the customer's own pages (http URL in their site inventory) the new pages are modelled on. Required unless projectId is given. |
projectId | string | no | One of the customer's own projects whose fields hold their {{Column}} template (find it with list_projects). Required unless exemplarUrl is given. |
rowSourceKind | string | no | Where the rows come from. Required with exemplarUrl; with projectId it defaults to the dataset already attached to that project. 'evidence': the user named the entities (towns, areas, services) but gave no facts; the agent sources, per entity, the f…user · library · gbp_locations · evidence |
entities | string | no | rowSourceKind=evidence: the entities the user named, one per intended page, exactly as they said them ('Chapeltown', 'Rotherham'), or the entities of a pattern find_page_set_patterns returned. |
sourceUrls | string | no | rowSourceKind=evidence: public pages the user named as sources (a council planning guide, a regulator's page, a trade body's list). Every sentence on them that names an entity becomes a cited fact for that entity's page. |
rows | string | no | rowSourceKind=user: the rows, one object per page (name + the facts the user gave: city, region, address, phone, hours, services, areasServed...). Keys become dataset columns in project mode. |
libraryDatasetId | string | no | rowSourceKind=library: the dataset id (list_datasets) |
rowTarget | integer | no | How many pages to aim for. |
allowGenText | boolean | no | Project mode: the template may carry per-row AI text badges (costs credits per page; the human sees the cost at gate 2) |
publishAsDraft | boolean | no | Stage generated pages as drafts instead of publishing on approval. |
publish_project_pageReturns send one page to the project's CMS, as the editor's Publish does: live by default, or as a CMS draft with publishAsDraft: true; a page already published is updated in place. The same guardrails as the dashboard apply (a duplicate or unrewritable address is held as a draft with a note; GitHub sites…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
pageId | string | yes | |
publishAsDraft | boolean | no | true = a draft in the CMS; default false = live. |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
regenerate_project_pageReturns rewrite one blog page from its keyword through the full pipeline (research, brief, article, images, quality gate), as the editor's Regenerate does: the page content is replaced when the run lands; a failed run keeps the current content and refunds. BILLS AI CREDITS (the estimate is in the refusal w…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | |
pageId | string | yes | |
confirm | boolean | no | Must be true. Attests the user explicitly asked for THIS action in this conversation after seeing what it does; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
remove_project_keywordsRemoves keywords from one of the workspace's blog projects, permanently: pass keywordIds (up to 100, ids from the project's keyword list) or all:true to remove every keyword of the project. Removing several or all needs an admin or the owner (the dashboard's rule); removing one keyword needs a membe…
| Field | Type | Required | Description |
|---|---|---|---|
projectId | string | yes | The blog project |
keywordIds | string | no | The keyword ids to remove (1 to 100) |
all | boolean | no | true = remove every keyword of the project |
confirm | boolean | no | Must be true: attests the user explicitly asked to remove exactly these keywords; never set it on your own judgment. |
confirmDestructive | boolean | no | The same attestation, as the confirm widget and the elicitation retry send it. |
remove_tracked_promptRemoves a tracked prompt from the AI-visibility monitor permanently (prefer update_tracked_prompt active:false to pause without losing the row). Get ids from list_tracked_prompts. Past scan history for the prompt stays, but the prompt itself is deleted, so it requires confirm: true after the user sa…
| Field | Type | Required | Description |
|---|---|---|---|
promptId | string | yes | From list_tracked_prompts |
confirm | boolean | no | true only after the user said yes to removing it. |
confirmDestructive | boolean | no | The same attestation as confirm, as an elicitation retry carries it. |
rename_workspaceReturns rename a workspace (admins and the owner): this one, or another by id, name or site from list_workspaces. 3 to 50 characters, unique in the organization. The first call states the change; it is renamed only after the user confirms. Deleting a workspace is not possible here; it stays in Settings. Co…
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | The new name, 3 to 50 characters. |
workspace | string | no | Which workspace (id, name or site from list_workspaces); default: this one. |
confirm | boolean | no | true only after the user said yes to this rename. |
confirmDestructive | boolean | no |
run_ai_visibility_scanReturns start a FRESH AI-search visibility scan: queries the live AI engines (ChatGPT, Claude and Google AI Overviews by default, plus any the monitor switched on, such as Perplexity) with buyer-intent prompts and measures whether the brand appears. Scans YOUR OWN site by default; pass domain to scan a COM…
| Field | Type | Required | Description |
|---|---|---|---|
domain | string | no | Competitor domain to scan instead of your own site, e.g. "competitor.com". Omit for your own site. |
is_my_site | boolean | no | Only when the workspace has no site on record yet: true if the domain is the user's own site, false if it is a competitor. Ask the user; never guess. |
save_blog_articleSaves an article you drafted IN this conversation so the user can publish it with one click. ONLY for inline drafting - when the user explicitly wants to read/iterate on the draft here in chat. For "write/create/publish a blog post about X", PREFER create_seo_tasks (type content_create, one article)…
| Field | Type | Required | Description |
|---|---|---|---|
title | string | yes | The blog article title |
content | string | yes | The full blog article content in Markdown format. |
slug | string | yes | URL slug for the article (e.g., "best-seo-tools-2025"). Lowercase with hyphens. |
excerpt | string | yes | A short summary/excerpt of the article (1-2 sentences). |
metaTitle | string | no | SEO meta title. Defaults to the article title. |
metaDescription | string | no | SEO meta description. Defaults to the excerpt. |
featuredImagePrompt | string | no | Optional: a short description of the featured image. Defaults to the title. |
publish | boolean | no | true = publish to the connected CMS now (needs confirm: true). Only when the user asked. |
publishAsDraft | boolean | no | With publish: true. Default true (a draft in the CMS); false = live. |
confirm | boolean | no | With publish: true: must be true. Attests the user explicitly asked to publish this article after reading it; never set it on your own judgment. |
confirmDestructive | boolean | no | Same attestation, the spelling the confirm widget sends. |
set_agent_settingsReturns change the workspace's agent controls, the same change as Settings > Agent: autonomyMode ('approval', 'assisted' or 'auto'), enabled (false turns the agents off within one tick; true turns them on and starts their first plan run), dailyCreditCap (credits per day, 1 to 1,000,000; null restores the d…
| Field | Type | Required | Description |
|---|---|---|---|
autonomyMode | string | no | How the agents decide. 'auto' needs confirm: true.approval · assisted · auto |
enabled | boolean | no | false = turn the agents off (kill switch); true = turn them on and start the first plan run. |
dailyCreditCap | integer | no | Most credits agent work may spend per day; null restores the default cap. |
publishGate | string | no | Publish-gate floors (0-100; minBaselineCompetitors 1-20); pass only the floors that change. The block floor must be at or below the warn floor. |
alwaysAskTypes | string | no | Task types that always wait for approval whatever the mode (replaces the list; [] clears it). |
confirm | boolean | no | Required true for autonomyMode 'auto' or 'assisted', a higher dailyCreditCap and a lowered publishGate floor: the user explicitly asked for it after hearing the consequence. |
confirmDestructive | boolean | no | The same attestation as confirm, as an elicitation retry carries it. |
set_brand_profileSaves the brand profile fields the user stated (company name, description, industry, elevator pitch, target audience, products), exactly as the Brand page's Save does: only the fields you pass change, others keep their value, and the same validation applies. Call it ONLY with facts the user gave in…
| Field | Type | Required | Description |
|---|---|---|---|
companyName | string | no | |
companyDescription | string | no | |
industry | string | no | |
priceRange | string | no | |
elevatorPitch | string | no | |
targetAudience | string | no | |
products | string | no |
set_monitor_enginesChooses which AI engines AI-visibility scans query. Options: openai, anthropic, google-aio, perplexity, google-ai-mode, copilot, gemini, grok; defaults: openai, anthropic, google-aio. Pass the FULL list to track (it replaces the current one), or reset:true to go back to the defaults. SPEND LEVER: ev…
| Field | Type | Required | Description |
|---|---|---|---|
engines | string | no | The complete set of engines to trackopenai · anthropic · google-aio · perplexity · google-ai-mode · copilot · gemini · grok |
reset | boolean | no | true = track the default engines |
locationCode | integer | no | Locale location code (default: the primary monitor locale) |
languageCode | string | no | Locale language code, e.g. "en" |
set_protected_pagesReturns change the protected (money) pages: mode add (default) adds URLs, remove takes them off, replace sets the whole list (max 200). Full URLs on the site, or a /path/* prefix for a whole section. Only on the user's explicit ask; admin or owner. A change that removes a URL (remove, or a replace that lea…
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | no | add · remove · replace |
pages | string | yes | |
confirm | boolean | no | Required true when the change removes a protected URL: the user explicitly asked for exactly that. |
confirmDestructive | boolean | no | The same attestation, as the elicitation retry sends it. |
set_scan_cadenceReturns change how often AI-visibility scans run: 'weekly' (default), 'daily', or 'manual' (only when the user triggers one). SPEND LEVER: daily is ~7x the weekly scan cost and is plan-gated - set 'daily' ONLY after the user explicitly asked for daily scanning and you told them the cost multiplier; never o…
| Field | Type | Required | Description |
|---|---|---|---|
cadence | string | yes | weekly · daily · manual |
locationCode | integer | no | Locale location code (default: the primary monitor locale) |
languageCode | string | no | Locale language code, e.g. "en" |
set_slack_channelReturns pick the Slack channel this site's decision cards go to (channelId from list_slack_channels), or pass channelId null to send them to the default channel again. With forAllSites true the channel becomes the organization's default for every site without its own. Organization owner only, as in Setting…
| Field | Type | Required | Description |
|---|---|---|---|
channelId | string | yes | A channel id from list_slack_channels, or null to use the default channel. |
forAllSites | boolean | no | true = set the default channel for the whole organization instead of this site. |
set_slack_settingsReturns change the Slack notification mode for the organization: cardMode each (one card per decision) or digest (one message per burst), weeklyReport on or off, mentionsEnabled on or off. Pass only the fields the user asked to change. Organization owner only, as in Settings. Cost: FREE.
| Field | Type | Required | Description |
|---|---|---|---|
cardMode | string | no | each = one card per decision; digest = one message per burst of decisions.each · digest |
weeklyReport | boolean | no | Post the weekly SEO report in Slack (off by default). |
mentionsEnabled | boolean | no | Allow @mentions on urgent cards (at most once per 6 hours per person). |
slack_install_linkReturns the link that installs (or reinstalls) the SEOmatic Slack app: a browser step where the organization owner picks the Slack workspace and the channel for decision cards. Organization owner only, as in Settings. Cost: FREE.
No input fields. It runs on the connected workspace.
submit_urlSubmits a URL through IndexNow (Bing) and IndexMeNow when set up in SEOmatic. Google accepts direct submissions only for job posting and livestream pages. Requires the Infrastructure plan.
| Field | Type | Required | Description |
|---|---|---|---|
url | string | yes | The http(s) URL to submit for indexing. |
suggest_protected_pagesReturns money pages worth protecting, suggested from Google Ads: landing pages the workspace pays for that convert (up to 10, with conversions), minus pages already listed or protected by default. Suggestions only: add them with set_protected_pages when the user agrees. Admin or owner. Cost: FREE.
No input fields. It runs on the connected workspace.
update_tracked_promptReturns edit a tracked prompt: rename it, pin it, or activate/deactivate it (deactivated prompts keep history but stop being scanned; reactivation re-checks the plan cap). Get ids from list_tracked_prompts. Cost: FREE - config change only.
| Field | Type | Required | Description |
|---|---|---|---|
promptId | string | yes | From list_tracked_prompts |
text | string | no | |
pinned | boolean | no | |
active | boolean | no |
upload_csvStages CSV TEXT so it can be imported as a dataset. This exists for MCP Apps hosts: MCP has no file transport, so a widget reads the user's file in the browser and passes its text here, receiving the same attachmentId a chat upload would mint. Pass that id straight to import_attachment_as_dataset. I…
| Field | Type | Required | Description |
|---|---|---|---|
fileName | string | yes | The file's name, e.g. cities.csv |
csvContent | string | yes | The raw CSV text, header row first |
write_blog_articlesReturns the DIRECT path for "write N blog articles": validates FIRST, then stages ONE approval card in this chat. Use this by DEFAULT when the user asks for multiple articles (2-50 topics) - it is the fast, single-gate path. Validation happens BEFORE the user sees anything: topics already covered by an exi…
| Field | Type | Required | Description |
|---|---|---|---|
topics | string | yes | One article per topic. Make them genuinely DISTINCT subjects - near-duplicates are collapsed by validation anyway. |
autoPublish | boolean | no | Default TRUE (founder decision 2026-10-06): articles that pass the quality gate and the reviewer publish on their own, with a receipt and one-click undo; any that fail stay as drafts. Pass false ONLY when the user explicitly asks to read the drafts… |
Eight Zaps built only from the triggers, searches and actions on this page, plus Zapier's own apps:
| Zap | Steps |
|---|---|
| Approve SEO fixes from Slack or email | Task Awaiting Approval > Slack or Gmail (ask a person) > Decide SEO Task (approve or dismiss). |
| Weekly Search Console report | Schedule by Zapier (Monday) > Find Search Queries > Find CTR Outliers > Google Sheets or Slack. |
| Weekly cannibalization fixes | Schedule by Zapier (weekly) > Find Cannibalization > Create SEO Tasks (staged for your approval). |
| Indexing watch for new pages | New Published Page > Submit URL for Indexing (IndexNow) > Delay by Zapier (3 days) > Inspect URL Indexing (Google) > alert if not indexed. |
| AI visibility log | AI Visibility Scan Completed > Find AI Visibility > Google Sheets (one row per scan). |
| Publish failure alert | Page Publish Failed > Slack or email to the person who owns the site. |
| Unhappy review alert | New Google Review > Filter by Zapier (stars 3 or fewer) > Slack or SMS to the owner, with the drafted reply waiting in SEOmatic. |
| Ranking drop log | Ranking Dropped > Google Sheets (one row per drop: search, page, places lost, who passed you). |
Triggers, searches and actions all need the Infrastructure plan, or Enterprise. Launch, Scale and trials do not include Zapier. The same rule applies to the n8n and Make integrations. The plan is re-checked on every call, so a downgrade takes effect at once.
Zaps never spend prepaid scans.An AI visibility scan started from Zapier runs on the workspace's AI credits. If they cannot cover it, the step fails with INSUFFICIENT_CREDITS (HTTP 402) instead of using a prepaid scan. Prepaid scans are only spent from the SEOmatic app or an MCP agent.
SEOmatic's error text reaches the Zap as is, with the upgrade link when there is one.
| Status | What it means | Fix |
|---|---|---|
401 / 403 | The connection is no longer valid, for example the grant was revoked in SEOmatic. | Zapier asks you to reconnect. Reconnect SEOmatic and approve again. |
402 ZAPIER_NOT_ENTITLED | The workspace is not on the Infrastructure plan. Every trigger, search and action needs Infrastructure. | Upgrade the workspace to Infrastructure. The message includes the link. |
402 REST_ACT_REQUIRES_INFRA | An action ran on a plan below Infrastructure. Actions need Infrastructure; Enterprise includes them too. | Upgrade the workspace to Infrastructure. The message includes the upgrade link. |
429 | The rate limit for tool runs: 60 per minute and 1,000 per hour per connection. | Space out the Zap, or let Zapier replay the step later. |
504 TOOL_TIMEOUT | The step took longer than 60 seconds. It was not stopped and keeps running in SEOmatic. | Check the outcome (for example with Find SEO Task) before running an action that makes changes again. |
Yes, with SEOmatic connected. Zaps can pull Search Console data, run site audits and indexing checks, read AI visibility and stage SEO fixes, and SEOmatic events such as a task awaiting approval, a page going live, a ranking drop or a new Google review can start a Zap.
The Infrastructure plan, for triggers, searches and actions alike, and Enterprise includes it too. The plan is checked when you connect and on every call, so a workspace on another plan fails at connect time with a clear message.
Actions that touch your content are proposal-based: SEOmatic stages the work and it follows your approval setting. Decide SEO Task is itself an approval, so a Zap that calls it approves for you. Keep a person in that step, for example with a Slack or email approval.
Yes. On Zapier, an integration's searches and actions are the tools exposed to AI agents, so SEOmatic's searches and actions are available in Zapier Agents, Zapier MCP and AI Actions.
Prefer another automation platform? The n8n SEO automation node has typed operations and the same trigger events, and the Make.com app runs any SEOmatic tool in a scenario and starts one on the same events with Watch Events. Both connect with an API key. For your own code, use the SEO API; for AI assistants, the SEO MCP server; for event delivery to your own endpoint, use Webhooks.