
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 Free Trial. $1 card check, refunded. Cancel Anytime.
Wire SEOmatic into the apps you already use, no code. 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 82 operations: 50 searches, 25 actions, and 7 triggers covering 6 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 Get 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. The Zapier integration is part of the Infrastructure plan, and the connection is tested against a plan-gated endpoint at connect time, so a lower 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 |
| Minimum plan to connect | Infrastructure |
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.
| Event | Key | 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. |
| Campaign completed | campaign.completed | A bulk-page or content campaign finishes. |
| Scan completed | ai_visibility.scan_completed | An AI-visibility scan finishes. |
| 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. |
scan_completedTriggers when an AI-visibility scan finishes.
No input fields - runs against the connected workspace as is.
campaign_completedTriggers when a bulk-page or content campaign finishes.
No input fields - runs against the connected workspace as is.
new_published_pageTriggers when a page goes live on your site.
No input fields - runs against the connected workspace as is.
page_publish_failedTriggers when a publish attempt fails, so you can alert or retry.
No input fields - runs against the connected workspace as is.
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 - runs against the connected workspace as is.
task_completedTriggers when an SEO agent task finishes.
No input fields - runs against the connected workspace as is.
eventTriggers when a SEOmatic event fires: a page publishes, a task or campaign completes, a task awaits your approval, or an AI-visibility scan finishes.
| 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_approvalDefault: page.published |
A search looks something up in SEOmatic and returns fields you can map into any downstream step. Searches are read-only. They 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.
| 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 (default 2000) |
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. Note: Google limits URL Inspection to 2,000 requests per day pe…
| 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. The fix is usually consolidation, a canonical, or differentiating intent.
| 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, using this site's own position-vs-CTR curve. These are title/meta rewrites with measurable upside: the ranking is already won, the click is being lost.
| 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, FAQs, videos, product snippets...). Shows which enhanced results you already earn and how they convert vs plain listings - the case for adding structured data where peers have it.
| 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, Gemini, Perplexity, Grok, Google AI Overviews), the prompts where the brand was MISSED and who won them instead, top competitors across engines, and the sources engines cite (link-target i…
| Field | Type | Required | Description |
|---|---|---|---|
scanId | string | no | A specific scan to read (from recentScans). Omit for the latest completed scan. |
run_ai_visibility_scanReturns start a FRESH AI-search visibility scan: queries the live AI engines (ChatGPT, Claude, Gemini, ...) with buyer-intent prompts and measures whether the brand appears. Scans YOUR OWN site by default; pass domain to scan a COMPETITOR instead (same engines, their brand). COSTS AI CREDITS from the works…
| 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. |
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 and current cadence. Cost: FREE - reads stored config, no AI credits.
| 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. connected=false means the customer has not set up the C…
| 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: 2840 for US). Examples: 2826 for UK, 2250 for France, 2276 for Germany. |
language_code | string | no | Language code (default: "en"). Examples: "fr", "de", "es". |
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: 2840 for US). |
language_code | string | no | Language code (default: "en"). |
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) |
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: 2840 for US). |
language_code | string | no | Language code (default: "en"). |
get_domain_overviewFinds an overview of a domain's SEO visibility including organic ranking distribution (how many keywords in top 1, top 3, top 10, etc.), 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: 2840 for US). |
language_code | string | no | Language code (default: "en"). |
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: 2840 for US). |
language_code | string | no | Language code (default: "en"). |
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 |
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.
| 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.
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 |
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) |
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 |
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) |
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) along with a list of critical, warning, and informational issues. Checks title, meta description, headings, content length, images, links, schema markup, and more.
| 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, thin content, noindex leaks, canonical mismatches,…
| 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). |
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.
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: a limit refusal returns the exact upgrade path to relay. Cost: adding is FREE; each active prompt increases the recurring scan cost when s…
| 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" |
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 |
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. |
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 - runs against the connected workspace as is.
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 - runs against the connected workspace as is.
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 - runs against the connected workspace as is.
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 - runs against the connected workspace as is.
get_referral_linkReturns the user's personal SEOmatic referral link and reward status. Returns: shareUrl (their /?ref= link), their referral funnel counts (totalReferred, activated, converted), and rewards earned (questionsEarned for a free account, creditsEarned for paid). Reward timing: both sides earn 5 free questions w…
No input fields - runs against the connected workspace as is.
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 - runs against the connected workspace as is.
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 - runs against the connected workspace as is.
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 - runs against the connected workspace as is.
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 - runs against the connected workspace as is.
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 - runs against the connected workspace as is.
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 - runs against the connected workspace as is.
list_page_templatesReturns the built-in page templates for programmatic SEO. Each has a hand-built section design, code-generated structured data and a code-computed internal-link graph - strictly better than an AI-authored {{variable}} template when one fits the ask. Returns each template's id, what it's for, the dataset co…
No input fields - runs against the connected workspace as is.
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). |
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. |
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_page_scale_campaignStages a landing-pages-AT-SCALE campaign (programmatic SEO: e.g. "a page for each of the 50 US states", "X vs Y comparison pages") - up to 500 pages generated from ONE agent-authored template + a dataset, then drip-published (10-25/day). TWO human gates, nothing runs from this call: (1) the user app…
| 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", "comparison pages", "use-case pages" |
brief | string | yes | The full brief the template author follows: audience, search intent, what each page must contain, tone |
rowSourceKind | string | yes | Where the page rows come from: ai = generate from Row Prompt, user = pass Rows yourself, library = a dataset, gbp_locations = your Business Profile locations.ai · user · library · gbp_locations |
rowPrompt | string | no | rowSourceKind=ai: what dataset to generate (e.g. 'the 50 US states with population, largest city, region') |
rows | string | no | rowSourceKind=user: the rows, one object per page (keys become dataset columns) |
libraryDatasetId | string | no | rowSourceKind=library: the dataset id to attach |
rowTarget | integer | no | How many pages to aim for. |
allowGenText | boolean | no | Allow up to 2 per-row AI text badges in the template (costs credits per page; default false = pure variables, 0 credits) |
publishAsDraft | boolean | no | Stage generated pages as drafts instead of publishing on approval. |
pageTemplate | string | no | A BUILT-IN template id from list_page_templates ('comparison', 'location'). Its section design, structured data and internal-link graph are CODE, so the pages cannot read as a mail-merge, cannot go thin, and cannot invent a link that 404s. Costs AI… |
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. Confirm with the user before removing - past scan history for the prompt stays, but the prompt itself is deleted. Cost:…
| Field | Type | Required | Description |
|---|---|---|---|
promptId | string | yes | From list_tracked_prompts |
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 | yes | A descriptive prompt for AI image generation to create the featured image. |
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" |
submit_urlSubmits a URL to Google and IndexMeNow for immediate recrawl. Requires the Infrastructure plan.
| Field | Type | Required | Description |
|---|---|---|---|
url | string | yes | The http(s) URL to submit for indexing. |
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 |
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 FALSE: every article stages as a draft for the user to read and publish themselves - net-new content carries their voice onto their public site, and approving topics is not consent to publish unread articles. Pass true ONLY when the user has… |
The whole Zapier surface, triggers, searches, and actions, is included with the Infrastructure plan. If you want SEOmatic wired into the rest of your stack, that is the plan to be on.