Free SEO MCP that closes the loop: find, fix, ship as a PR or to a CMS, prove. 37 tools, no key.
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Accessibility for people and the European Accessibility Act. Pick with mode: wcag = WCAG 2.1 AA checks. Needs url. screen_reader = The page as a screen reader reads it. Needs url.
Full address of the page, for example https://example.com/pricing.
Default wcag.
Optional: an accessibility snapshot from your own browser (role, name, level, children), for example Puppeteer page.accessibility.snapshot().
brief = short summary.
site_memory key, records this call.
Accessibility for people and the European Accessibility Act. Pick with mode: wcag = WCAG 2.1 AA checks. Needs url. screen_reader = The page as a screen reader reads it. Needs url.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address of the page, for example https://example.com/pricing. |
| mode | string | Default wcag. |
| tree | object | Optional: an accessibility snapshot from your own browser (role, name, level, children), for example Puppeteer page.accessibility.snapshot(). |
| detail | string | brief = short summary. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page, for example https://example.com/pricing."
},
"mode": {
"enum": [
"wcag",
"screen_reader"
],
"type": "string",
"description": "Default wcag."
},
"tree": {
"type": "object",
"description": "Optional: an accessibility snapshot from your own browser (role, name, level, children), for example Puppeteer page.accessibility.snapshot()."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}Whether AI assistants can read, quote and recommend a site. Pick with mode: check = AI crawler access, llms.txt, 15 citability checks and the page as a model reads it. Needs url. bots = Fetch the page as Googlebot, GPTBot, ClaudeBot, PerplexityBot and more against a browser: firewall blocks, challenges, cloaking. Needs url. gaps = Where AI answers name competitors, not you, from Brand Radar or similar. Needs site, brand, responses[{question, response, links, search_queries, engine, volume}]. citations = What pages cited by AI do differently, from citation counts. Needs pages[{url, chatgpt, perplexity, gemini, google_ai_overviews, google_ai_mode}].
| Argument | Type | Description |
|---|---|---|
| url | string | Full address of the page, for example https://example.com/pricing. |
| mode | string | Default check. |
| site | string | Your site, for example example.com. |
| brand | string | Your brand name as people write it. |
| pages | array | |
| detail | string | brief = short summary. |
| source | string | Where the citation counts come from. |
| responses |
Whether a page answers the questions people ask AI and Google. Pick with mode: questions = Sub-questions AI Mode fans out to, and which the page answers. Needs url, topic, questions. passages = The passages that answer given questions, or the gaps. Needs url, question. format = Answer format against the pages that rank. Needs url, question, competitors.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address of the page. |
| mode | string | Default questions. |
| topic | string | The topic or main query, for example 'passport renewal'. |
| detail | string | brief = short summary. |
| question | string | The question people ask, for example 'how long does shipping take to Germany'. |
| questions | array | The sub-questions an AI search engine would ask for the topic. |
| memory_key | string | site_memory key, records this call. |
| competitors | array | Optional: up to 2 pages that rank for the topic. |
Turn backlink data from Ahrefs, Semrush or similar into links won back, won or cleaned up. Pick with mode: broken = Broken and lost backlinks and 404 visits into 301s and outreach. Needs rows[{target_url, source_url, anchor, domain_rating, dofollow, http_code}]. opportunities = Sites linking to competitors, and unlinked brand mentions. Needs site. outreach = One outreach email per site, as drafts for the user's mail after approval. Needs your_site, prospects[{page, type, your_url, dead_url, anchor, contact}]. disavow = A conservative disavow.txt, only after a manual action or clear negative SEO. Needs rows[{url_from, domain, is_spam, domain_rating, anchor, traffic}], reason.
| Argument | Type | Description |
|---|---|---|
| mode | string | Default broken. |
| rows | array | Broken backlink rows, one per linking page. |
| site | string | Optional: your site's address. |
| brand | string | Brand name to look for in mention pages. |
| yours | array | Your own referring domains. |
| detail | string | brief = short summary. |
| format | string | Rule format, default redirects (Cloudflare Pages and Netlify _redirects). |
How pages target a keyword. Pick with mode: focus = One page against one keyword: 8 checks. Needs url, keyword. cannibalization = Your pages competing for one keyword, side by side on every signal, with the plan. Needs keyword, target_url.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address of the page, for example https://example.com/pricing. |
| mode | string | Default focus. |
| rows | array | Optional Search Console rows for the keyword, to find the competing pages and their positions. |
| detail | string | brief = short summary. |
| keyword | string | The search term the page should rank for, for example 'running shoes'. |
| memory_key | string | site_memory key, records this call. |
| target_url | string | The page that should rank for it. |
| competing_urls | array | Other pages of the same site that compete for the keyword. |
Status of URLs and links. Pick with mode: urls = Status, redirect chain and canonical of a list of URLs. Needs urls. outbound = Dead or moved links from a page to other sites, with archived copies. Needs url.
| Argument | Type | Description |
|---|---|---|
| url | string | The page to check. |
| mode | string | Default urls. |
| urls | array | Addresses to check. |
| detail | string | brief = short summary. |
| expected | array | Optional expected final address for each URL, in the same order. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The page to check."
},
"mode": {
"enum": [
"urls",
"outbound"
],
"type": "string",
"description": "Default urls."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 20,
"minItems": 1,
"description": "Addresses to check."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"expected": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 20,
"description": "Optional expected final address for each URL, in the same order."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}Compare pages side by side. Pick with mode: pages = Your page against up to 3 competitors. Needs url, competitors. html = Two versions of HTML before and after. Needs before, after. preview = Deploy preview against production before merging. Needs preview_url, production_url.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address, for example https://example.com. |
| mode | string | Default pages. |
| after | string | HTML after the change. |
| paths | array | Paths like /pricing, default /. |
| before | string | HTML before the change. |
| detail | string | brief = short summary. |
| keyword | string | Optional search term to compare keyword use. |
| memory_key | string | site_memory key, records this call. |
| competitors | array | Competitor page addresses. |
What to write and how, in the site's own voice, from the pages that rank and the user's search data. Pick with mode: brief = A content brief from the pages that rank. Needs keyword, competitors. topics = Search Console queries into topics, with the page that owns each, and keyword gaps. Needs rows[{query, page, clicks, impressions, position, url}]. intent = Your page against the search intent of the pages that rank. voice = Learn how the site writes from its best articles. Needs urls. calendar = A dated calendar of refreshes and new pages, steered by what worked here. draft = A draft against the site's voice, sources and SEO, before approval. Needs html.
| Argument | Type | Description |
|---|---|---|
| url | string | Optional: your existing page for this term. |
| html | string | The draft as HTML, title in <title> or <h1>. |
| mode | string | Default brief. |
| rows | array | Search Console rows by query and page. |
| urls | array | The site's own best articles, ones that rank and that the owner likes. |
| ideas | array | Topics without a page yet. |
| start | string | First day, YYYY-MM-DD, default today. |
A daily SEO data feed for key pages and a live dashboard in the chat. Pick with mode: feed = Start a daily feed of key pages; returns feed_id. Needs url. data = The feed as clean tables over time. Needs feed_id, dataset. build = Blueprint for a live SEO command center with realtime GA4 visitors. Needs feed_id.
| Argument | Type | Description |
|---|---|---|
| to | string | End date, YYYY-MM-DD. |
| url | string | Home page of the site. |
| from | string | Start date, YYYY-MM-DD. |
| mode | string | Default feed. |
| name | string | Optional name, for example the client's name. |
| pages | array | Optional key pages to track, up to 10. |
| detail | string | brief = short summary. |
| format | string | blueprint (default) for Claude Dashboards, or html for a complete, designed dashboard page filled with the feed's data, ready to show as an artifact. |
| dataset | string | |
| feed_id | string |
Fixes applied at the edge on the user's own Cloudflare, on any CMS. Pick with mode: rules = One Worker that fixes a whole section by rules. Needs audit_id. prerender = Serve rendered HTML to AI crawlers for JavaScript apps. Needs url.
| Argument | Type | Description |
|---|---|---|
| url | string | A page of the app, for example https://app.example.com/pricing. |
| mode | string | Default rules. |
| detail | string | brief = short summary. |
| audit_id | string | Id of a completed site audit (start_site_audit, then get_site_audit until complete). |
| site_name | string | Brand name for title endings, for example 'Acme Shoes'. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "A page of the app, for example https://app.example.com/pricing."
},
"mode": {
"enum": [
"rules",
"prerender"
],
"type": "string",
"description": "Default rules."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"audit_id": {
"type": "string",
"maxLength": 2000,
"description": "Id of a completed site audit (start_site_audit, then get_site_audit until complete)."
},
"site_name": {
"type": "string",
"maxLength": 2000,
"description": "Brand name for title endings, for example 'Acme Shoes'."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}How Google understands who is behind a site. Pick with mode: graph = Organization, sameAs, logo and founder in structured data. Needs url. trust = Author, about, contact and policy signals. Needs url.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address, for example https://example.com/blog/post. |
| mode | string | Default graph. |
| detail | string | brief = short summary. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address, for example https://example.com/blog/post."
},
"mode": {
"enum": [
"graph",
"trust"
],
"type": "string",
"description": "Default graph."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}Explain what Google Search Console and Bing Webmaster Tools report, and what to do. Pick with mode: index_status = Index coverage and rich result statuses, with the fix. Needs rows[{url, coverageState, verdict, indexingState, robotsTxtState, pageFetchState}]. manual_action = A manual action, with the cleanup plan and reconsideration draft. Needs action. bing = Bing Webmaster crawl issues, and Bing against Google per query.
| Argument | Type | Description |
|---|---|---|
| mode | string | Default index_status. |
| rows | array | |
| site | string | The site or Search Console property. |
| action | string | The manual action as Search Console shows it. |
| detail | string | brief = short summary. |
| issues | array | Bing crawl or index issues. |
| memory_key | string | site_memory key, records this call. |
| sample_urls | array | Example URLs Google listed. |
| bing_queries |
Turn Search Console, GA4 or Ahrefs rows (also rows the user pastes) into the fastest wins, instead of judging them by hand; content_decay and traffic_drop take search_type for Discover, News, Image or Video rows. Pick with mode: ctr_gaps = Page 1 results with a click-through rate far below normal. Needs rows[{position, page, query, clicks, impressions, ctr}]. striking_distance = Queries at positions 8 to 20 worth a push. Needs rows[{position, page, query, clicks, impressions, ctr}]. content_decay = Pages slowly losing clicks over months: a refresh queue. Needs rows[{url, month, clicks}]. traffic_drop = Explain a drop page by page, by device and country. Needs rows[{url, before, after, query, device, country}]. prune = Keep, refresh, merge (301), noindex or remove (410) per page. Needs rows[{url, clicks, impressions, conversions, referring_domains, inlinks}]. discover = Readiness for Google Discover and News, with Discover or News rows. paid_organic = Google Ads terms against Search Console: ad spend you can test cutting, content to write. Needs ads[{term, cost, clicks, conversions}], gsc[{query, position, clicks, page}]. anomalies = Spike and drop days in daily rows, with Google updates near them. Needs rows[{date, clicks, impressions, page}]. ai_queries = Question and prompt-style queries per page, for AI answers. Needs rows[{query, page, clicks, impressions, position}].
| Argument | Type | Description |
|---|---|---|
| ads | array | Google Ads search terms. |
| gsc | array | Search Console queries. |
| mode | string | Default ctr_gaps. |
| rows | array | Search Console rows for one period (28 days works well). |
Record shipped fixes, keep them live and report on them. Pick with mode: log = Record a shipped fix; checked every 6 hours, restore code on regression. Needs fixes[{url, field, new, old, via, ref}]. report = Every fix with status and results: a monthly client report. Needs fix_log_id.
| Argument | Type | Description |
|---|---|---|
| mode | string | Default log. |
| brand | string | For the report: your agency name for the header. |
| fixes | array | |
| month | string | For the report: YYYY-MM. |
| detail | string | brief = short summary. |
| format | string | status (default), a client report, or GA4 annotations (one per ship date) for the Admin API. |
| verify | boolean | Check the live pages now (4 pages per call). |
| webhook | string | Optional https URL (Slack, Discord, Zapier, n8n, a GitHub Action) that gets the restore code when a fix is undone. |
| fix_log_id | string | Add to an existing log. |
| memory_key |
Fixes ready to ship: as code, for a CMS through its MCP, as a pull request or at the edge. Pick with mode: fixes = Title, description, canonical, social tags, JSON-LD; platform html, wordpress, shopify, webflow, wix, storyblok, sanity, contentful, strapi, ghost, magento, git or cloudflare. Needs url. alt_texts = Write and ship missing alt texts. Needs url. web_vitals = Speed fixes as tags, WordPress steps or a Worker. Needs url. wordpress = Send fixes, new drafts and post updates to the OnPage.dev WordPress plugin for one-click approval and undo. Needs site_key.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address of the page, for example https://example.com/pricing. |
| alts | array | Step 2: the alt text per image src. |
| mode | string | Default fixes. |
| note | string | Optional reason shown to the site owner. |
| detail | string | brief = short summary. |
| changes | array | Optional field and new value pairs. |
| failing | array | Metrics that fail for real users, if known. |
| platform | string | html (default) for code to paste; wordpress, webflow, wix, shopify, storyblok, sanity, contentful, strapi, ghost or magento for a plan with the exact fields and |
Internal links and link equity. Pick with mode: suggest = Links to add, with anchors, applied by Worker or CMS. Needs audit_id. equity = Internal PageRank and click depth from a site audit. Needs audit_id.
| Argument | Type | Description |
|---|---|---|
| mode | string | Default suggest. |
| topic | string | Topic or main keyword of the target page. |
| detail | string | brief = short summary. |
| phrases | array | Optional: phrases to turn into the link, besides the anchor text, for example natural variants. |
| audit_id | string | Id of a completed site audit. |
| platform | string | Optional: also return the links ready to apply: a Cloudflare Worker that links the first mention on each page, a WordPress edit plan, or the edits for the code. |
| memory_key | string | site_memory key, records this call. |
| target_url | string | Page that should receive links. |
| important_urls |
What visitors and crawlers see on every screen size. Pick with mode: render = First screen on phone, tablet and desktop in a real browser, and what crawlers without JavaScript get (default). Needs url. probe = A measurement script to run in the user's own browser tool. analyze = Analyse the results of that script. Needs url, results.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address of the page, for example https://example.com/pricing. |
| mode | string | Default render. |
| no_js | object | Optional: the probe result with JavaScript turned off, for an exact comparison. |
| detail | string | brief = short summary. |
| results | array | One probe result per viewport, each with device set to phone, tablet or desktop. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page, for example https://example.com/pricing."
},
"mode": {
"enum": [
"render",
"probe",
"analyze"
],
"type": "string",
"description": "Default render."
},
"no_js": {
"type": "object",
"description": "Optional: the probe result with JavaScript turned off, for an exact comparison."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"results": {
"type": "array",
"items": {
"type": "object"
},
"maxItems": 4,
"minItems": 1,
"description": "One probe result per viewport, each with device set to phone, tablet or desktop."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}The llms.txt file for AI assistants. Pick with mode: generate = Write one from the sitemap and home page. Needs url. validate = Check an existing one and its links. Needs url.
| Argument | Type | Description |
|---|---|---|
| url | string | Home page of the site, for example https://example.com. |
| mode | string | Default generate. |
| text | string | Optional llms.txt content to validate instead of the live file. |
| detail | string | brief = short summary. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Home page of the site, for example https://example.com."
},
"mode": {
"enum": [
"generate",
"validate"
],
"type": "string",
"description": "Default generate."
},
"text": {
"type": "string",
"maxLength": 1048576,
"description": "Optional llms.txt content to validate instead of the live file."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}Local search: the site, the Business Profile and the map. Pick with mode: check = LocalBusiness markup, NAP, locations and the Business Profile (default). Needs url. reviews = Reply drafts for Google reviews, unhappy ones first, for the user's GBP connector after approval. Needs reviews[{rating, author, text, date, replied, review_id}]. demand = Business Profile search terms and geo-grid ranks into new service and location pages.
| Argument | Type | Description |
|---|---|---|
| url | string | The home page, a location page or the locations overview page. |
| city | string | Main city, left out when matching terms to pages. |
| grid | array | Optional geo-grid rankings. |
| mode | string | Default check. |
| pages | array | The site's page URLs, e.g. |
| terms | array | Search terms from the Business Profile performance report. |
| detail | string | brief = short summary. |
| contact | string | Where unhappy customers can reach you, e.g. |
| reviews |
Prove and measure with numbers from the user's Search Console, GA4, Ahrefs or Semrush, including numbers the user pastes. Use it instead of calculating by hand: it handles spelling variants, control groups and trends. Pick with mode: impact = Before and after fixes, against pages you did not touch. Needs pages[{url, before, after, changed, fix}]. ai_citations = AI citations before and after, per engine. Needs pages[{url, before, after, changed}]. ai_referrals = Visits from ChatGPT, Perplexity, Gemini and other assistants, from GA4. Needs rows[{source, sessions, landing_page, period, conversions, revenue}]. brand_split = Brand versus non-brand clicks and how each moved. Needs brand_terms, rows[{query, keyword, clicks, traffic, impressions, position}]. share_of_voice = Share of the clicks against competitors from rank rows. Needs your_domain, rows[{keyword, position, volume, domain, url, group}].
| Argument | Type | Description |
|---|---|---|
| days | integer | Length of each period in days. |
| mode | string | Default impact. |
| rows | array | |
| pages | array | |
| detail | string | brief = short summary. |
| source | string | Where the counts come from, for example Ahrefs Brand Radar. |
| fix_date | string | Date the fixes went live, YYYY-MM-DD. |
Plans for migrations, experiments and the team. Pick with mode: redirects = Redirect map for a migration or URL change. split_test = SEO split test on a page template, with the Worker. Needs urls, field, pattern. sprint = Fixes into a week plan of tickets per role. Needs fixes[{title, url, detail, severity, impact, effort}].
| Argument | Type | Description |
|---|---|---|
| mode | string | Default redirects. |
| urls | array | Pages of one template. |
| field | string | What to change. |
| fixes | array | |
| hours | object | Hours per week per role, default 8 each. |
| weeks | number | Weeks to plan, default 4. |
| clicks | array | Optional clicks per page for a balanced split. |
| detail | string | brief = short summary. |
| format | string | Output format, default redirects (Cloudflare Pages and Netlify). |
Use when Search Console, GA4, Ahrefs or Semrush data is available, also to explain a traffic drop (pass clicks_previous): ranks the fixes by the traffic or revenue they can win. Rank SEO fixes by how much traffic they can win, using data from the user's other connected tools. With GA4, also pass each page's organic conversions (key events) or revenue, and fixes are ranked by the money they can bring instead of clicks.
| Argument | Type | Description |
|---|---|---|
| pages* | array | |
| detail | string | brief = short summary. |
| source | string | Where the numbers come from. |
| audit_id | string | Optional id of a finished site audit, so pages are not scanned again. |
| currency | string | Currency of revenue, for example EUR or USD. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"required": [
"pages"
],
"properties": {
"pages": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"ctr": {
"type": "number",
"minimum": 0,
"description": "Click-through rate, 0-1 or a percentage."
},
"url": {
"type": "string",
"maxLength": 2048
},
"clicks": {
"type": "number",
"minimum": 0
},
"queries": {
"type": "array",
"items": {
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 2000
},
"clicks": {
"type": "number",
"minimum": 0
},
"volume": {
"type": "number",
"minimum": 0,
"description": "Monthly search volume."
},
"position": {
"type": "number",
"minimum": 0
},
"impressions": {
"type": "number",
"minimum": 0
}
}
},
"maxItems": 20
},
"revenue": {
"type": "number",
"minimum": 0,
"description": "Revenue from this page's organic visits in the same period."
},
"traffic": {
"type": "number",
"minimum": 0,
"description": "Estimated monthly organic visits (Ahrefs/Semrush) or sessions (GA4)."
},
"position": {
"type": "number",
"minimum": 0
},
"backlinks": {
"type": "number",
"minimum": 0
},
"conversions": {
"type": "number",
"minimum": 0,
"description": "Conversions (GA4 key events, sales, leads) from this page's organic visits in the same period."
},
"impressions": {
"type": "number",
"minimum": 0
},
"clicks_previous": {
"type": "number",
"minimum": 0,
"description": "Clicks in an earlier period of the same length, for example the same 3 months a year or 6 months ago. Pages that lost clicks get a refresh fix."
},
"referring_domains": {
"type": "number",
"minimum": 0
}
}
},
"maxItems": 10,
"minItems": 1
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"source": {
"enum": [
"gsc",
"ga4",
"ahrefs",
"semrush",
"other"
],
"type": "string",
"description": "Where the numbers come from."
},
"audit_id": {
"type": "string",
"maxLength": 2000,
"description": "Optional id of a finished site audit, so pages are not scanned again."
},
"currency": {
"type": "string",
"maxLength": 3,
"description": "Currency of revenue, for example EUR or USD."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}Get changed pages recrawled. Pick with mode: recrawl = Check pages are indexable, sitemap lastmod entries, IndexNow and Search Console steps (default). Needs urls. indexnow = Submit URLs to IndexNow, or set up the key. Needs urls.
| Argument | Type | Description |
|---|---|---|
| key | string | The site's IndexNow key (8 to 128 letters, digits or dashes). |
| mode | string | Default recrawl. |
| urls | array | Changed pages on one site. |
| detail | string | brief = short summary. |
| memory_key | string | site_memory key, records this call. |
| indexnow_key | string | Optional IndexNow key that is live at /<key>.txt. |
{
"type": "object",
"properties": {
"key": {
"type": "string",
"maxLength": 2000,
"description": "The site's IndexNow key (8 to 128 letters, digits or dashes)."
},
"mode": {
"enum": [
"recrawl",
"indexnow"
],
"type": "string",
"description": "Default recrawl."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"description": "Changed pages on one site."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"indexnow_key": {
"type": "string",
"maxLength": 2000,
"description": "Optional IndexNow key that is live at /<key>.txt."
}
},
"additionalProperties": false
}robots.txt for search and AI crawlers. Pick with mode: test = Which crawlers may fetch a URL, and the rule that decides. Needs url. ai_policy = Rules per AI crawler: allow AI search, block training. Needs url, policy.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address of the page, for example https://example.com/pricing. |
| mode | string | Default test. |
| detail | string | brief = short summary. |
| policy | string | Which AI crawlers to allow. |
| memory_key | string | site_memory key, records this call. |
| robots_txt | string | Optional robots.txt content to test instead of the live file. |
| user_agents | array | Crawler names, for example Googlebot, GPTBot, ClaudeBot, PerplexityBot. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page, for example https://example.com/pricing."
},
"mode": {
"enum": [
"test",
"ai_policy"
],
"type": "string",
"description": "Default test."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"policy": {
"enum": [
"allow_all",
"search_only",
"block_training",
"block_all"
],
"type": "string",
"description": "Which AI crawlers to allow."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"robots_txt": {
"type": "string",
"maxLength": 524288,
"description": "Optional robots.txt content to test instead of the live file."
},
"user_agents": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 20,
"description": "Crawler names, for example Googlebot, GPTBot, ClaudeBot, PerplexityBot."
}
},
"additionalProperties": false
}Scan a page for Google and AI search: 0-100 score, issues to fix first with why and how, AI readiness and key facts. Pick with mode: page = A live page by url (default). Needs url. html = Unpublished HTML before deploy, to gate a release. Needs html. deep = Everything measured on one page, by section. Needs url. rescan = Scan again after fixes and compare with the last scan. Needs url.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address of the page, for example https://example.com/pricing. |
| html | string | The complete HTML document, up to 900 KB. |
| mode | string | Default page. |
| detail | string | brief = short summary. |
| sections | array | Sections to include. Default: all. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page, for example https://example.com/pricing."
},
"html": {
"type": "string",
"maxLength": 921600,
"description": "The complete HTML document, up to 900 KB."
},
"mode": {
"enum": [
"page",
"html",
"deep",
"rescan"
],
"type": "string",
"description": "Default page."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"sections": {
"type": "array",
"items": {
"enum": [
"speed",
"links",
"accessibility",
"images",
"rich_results",
"security",
"content",
"technical"
],
"type": "string"
},
"description": "Sections to include. Default: all."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}JSON-LD structured data for rich results. Pick with mode: generate = Write JSON-LD for a page: type Article, Product, FAQPage, Organization, BreadcrumbList, VideoObject, Event, Recipe, JobPosting, SoftwareApplication, ProfilePage or Course. Needs url. validate = Validate JSON-LD for rich results. Needs jsonld. product_page = Check an existing ecommerce product page (price, stock, merchant listing fields). To write Product JSON-LD use generate with type Product. Needs url.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address of the page, for example https://example.com/pricing. |
| mode | string | Default generate. |
| type | string | Schema type, default auto. |
| detail | string | brief = short summary. |
| jsonld | string | The JSON-LD as text, with or without the <script> tag. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page, for example https://example.com/pricing."
},
"mode": {
"enum": [
"generate",
"validate",
"product_page"
],
"type": "string",
"description": "Default generate."
},
"type": {
"enum": [
"auto",
"Article",
"Product",
"FAQPage",
"Organization",
"BreadcrumbList",
"VideoObject",
"Event",
"Recipe",
"JobPosting",
"SoftwareApplication",
"ProfilePage",
"Course"
],
"type": "string",
"description": "Schema type, default auto."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"jsonld": {
"type": "string",
"maxLength": 1048576,
"description": "The JSON-LD as text, with or without the <script> tag."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}Send results where the team works. Pick with mode: link = A link to the visual report. Needs url. export = A Google Sheet, CSV, Slack message or one task per issue.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address, for example https://example.com/pricing. |
| mode | string | Default link. |
| detail | string | brief = short summary. |
| audit_id | string | A finished site audit from start_site_audit, to export the whole site. |
| memory_key | string | site_memory key, records this call. |
| slack_webhook_url | string | Optional https incoming webhook (Slack, Discord, Teams) to post the summary to. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address, for example https://example.com/pricing."
},
"mode": {
"enum": [
"link",
"export"
],
"type": "string",
"description": "Default link."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"audit_id": {
"type": "string",
"maxLength": 2000,
"description": "A finished site audit from start_site_audit, to export the whole site."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"slack_webhook_url": {
"type": "string",
"maxLength": 2048,
"description": "Optional https incoming webhook (Slack, Discord, Teams) to post the summary to."
}
},
"additionalProperties": false
}Audit a whole site, step by step, and work with the result. Pick with mode: start = Start an audit of up to 25 pages; returns audit_id. Needs url. continue = Scan the next pages; call until complete. Issues by code, sections, average score. Needs audit_id. import = Turn a crawl from Screaming Frog, Ahrefs or Semrush (up to 500 pages) into an audit_id. Needs pages[{url, status, redirect_to, title, meta_description, h1}]. compare = What changed since the last audit, or against a competitor audit. Needs audit_id. report = A client-ready report page with a link. Needs audit_id.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address, for example https://example.com. |
| mode | string | Default start. |
| note | string | Optional short note for the reader, shown at the top. |
| brand | string | Optional agency or team name to show instead of OnPage.dev. |
| links | array | Optional internal links, for link equity, orphans and internal link suggestions. |
| pages | array | One row per crawled page. |
| detail | string | brief = short summary. |
| source | string | Where the rows come from, for example Screaming Frog or Ahrefs Site Audit. |
A memory per site that every OnPage.dev tool writes to, across chats and clients. Open it first when working on a site over time. Pick with mode: open = Open or create the memory, bind it to this chat, get the brief and next steps (default). Needs url. next = The best next steps from everything recorded. timeline = What happened, newest first. note = Record a decision or context. Needs note. forget = Delete the memory (ask the user first). Needs memory_key.
| Argument | Type | Description |
|---|---|---|
| url | string | The site's home page. |
| kind | string | |
| mode | string | Default open. |
| note | string | |
| limit | number | |
| detail | string | brief = short summary. |
| memory_key | string | The memory_key you got when the memory was created. |
| share_learning | boolean | Opt in (true) or out (false) of sharing anonymous results: only the fix type and the rounded lift, never the site, URLs or numbers. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The site's home page."
},
"kind": {
"enum": [
"scan",
"audit",
"fix",
"measure",
"rank",
"alert",
"plan",
"content",
"links",
"local",
"ai",
"tech",
"note"
],
"type": "string"
},
"mode": {
"enum": [
"open",
"next",
"timeline",
"note",
"forget"
],
"type": "string",
"description": "Default open."
},
"note": {
"type": "string",
"maxLength": 1000
},
"limit": {
"type": "number",
"maximum": 200,
"minimum": 1
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "The memory_key you got when the memory was created."
},
"share_learning": {
"type": "boolean",
"description": "Opt in (true) or out (false) of sharing anonymous results: only the fix type and the rounded lift, never the site, URLs or numbers."
}
},
"additionalProperties": false
}The XML sitemap. Pick with mode: check = Check the sitemap and a sample of its URLs. Needs url. generate = Write a sitemap from a page list or audit. Needs audit_id.
| Argument | Type | Description |
|---|---|---|
| url | string | The site's home page, or the sitemap URL itself. |
| mode | string | Default check. |
| detail | string | brief = short summary. |
| audit_id | string | A finished site audit. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The site's home page, or the sitemap URL itself."
},
"mode": {
"enum": [
"check",
"generate"
],
"type": "string",
"description": "Default check."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"audit_id": {
"type": "string",
"maxLength": 2000,
"description": "A finished site audit."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}How a page looks in Google and when shared, measured in pixels the way Google truncates. Use it instead of estimating title or description length. Pick with mode: search = Title and description as Google shows them; give title (and description) or a url to read them. social = Open Graph and X cards, and the share image. Needs url.
| Argument | Type | Description |
|---|---|---|
| url | string | Page to read the current title and description from, when no title is given. |
| mode | string | Default search. |
| title | string | Proposed title tag text. |
| detail | string | brief = short summary. |
| memory_key | string | site_memory key, records this call. |
| description | string | Proposed meta description. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Page to read the current title and description from, when no title is given."
},
"mode": {
"enum": [
"search",
"social"
],
"type": "string",
"description": "Default search."
},
"title": {
"type": "string",
"maxLength": 2000,
"description": "Proposed title tag text."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"description": {
"type": "string",
"maxLength": 2000,
"description": "Proposed meta description."
}
},
"additionalProperties": false
}Technical checks across pages and logs. Pick with mode: hreflang = Hreflang across language versions, with the corrected tag set. Needs url. parameters = URL parameters and filters that waste crawl budget. duplicates = Duplicate and near-duplicate pages. Needs audit_id. extract = One value pulled from many pages. Needs urls. logs = Access logs: what Googlebot and AI crawlers really crawl, with IP verification. Needs log.
| Argument | Type | Description |
|---|---|---|
| log | string | Raw access log lines, one request per line. |
| url | string | Full address of one language version of the page. |
| mode | string | Default hreflang. |
| urls | array | Optional extra URLs, for example from server logs or Search Console. |
| regex | string | A regular expression; the first group is returned if there is one, otherwise the whole match. |
| detail | string | brief = short summary. |
| jsonld | string | A JSON-LD path: the @type, then the properties, for example Product.offers.price or Article.author.name. |
| audit_id | string |
Readability and correct language. Pick with mode: readability = Readability that fits the page and the pages that rank. Needs url. spelling = Spelling and grammar errors in about 30 languages. Needs url.
| Argument | Type | Description |
|---|---|---|
| url | string | Your page. |
| mode | string | Default readability. |
| detail | string | brief = short summary. |
| keyword | string | Optional: the search term, for context. |
| memory_key | string | site_memory key, records this call. |
| competitors | array | Optional: top organic results for the keyword. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Your page."
},
"mode": {
"enum": [
"readability",
"spelling"
],
"type": "string",
"description": "Default readability."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"keyword": {
"type": "string",
"maxLength": 2000,
"description": "Optional: the search term, for context."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"competitors": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 8,
"description": "Optional: top organic results for the keyword."
}
},
"additionalProperties": false
}Use for ongoing rank tracking without picking keywords by hand. Each run, fetch Search Console rows by query and page (last 7 or 28 days) and, if connected, the rows of Ahrefs Rank Tracker (rank-tracker-overview) or Semrush Position Tracking, plus GA4 conversions or revenue per landing page if available, and pass them with the tracker_id (leave it out on the first run to create a tracker).
| Argument | Type | Description |
|---|---|---|
| site | string | Your site. Needed on the first run. |
| action | string | run (default), status or stop. |
| detail | string | brief = short summary. |
| gsc_rows | array | Search Console rows by query and page for the period. |
| fix_log_id | string | Optional fix log (log_fix) whose pages count as work done. |
| memory_key | string | site_memory key, records this call. |
| tracker_id | string | From the first run. Leave out to create a tracker. |
| conversions | array | Optional GA4 key events or revenue per landing page. |
| webhook_url | string |
Whether analytics and consent are set up right, and whether the numbers add up. Pick with mode: ga4 = GA4 tags, events and duplicates. Needs url. consent = Cookie banner and Consent Mode v2. Needs url. gsc_vs_ga4 = Search Console clicks against GA4 sessions per page: broken or filtered tracking. Needs gsc[{page, clicks}], ga4[{landing_page, sessions}].
| Argument | Type | Description |
|---|---|---|
| ga4 | array | GA4 sessions per landing page, organic Google only. |
| gsc | array | Search Console clicks per page. |
| url | string | Full address of the page, for example https://example.com/. |
| mode | string | Default ga4. |
| detail | string | brief = short summary. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"ga4": {
"type": "array",
"items": {
"type": "object",
"required": [
"landing_page",
"sessions"
],
"properties": {
"sessions": {
"type": "number",
"minimum": 0
},
"landing_page": {
"type": "string",
"maxLength": 2000
}
}
},
"maxItems": 5000,
"minItems": 1,
"description": "GA4 sessions per landing page, organic Google only."
},
"gsc": {
"type": "array",
"items": {
"type": "object",
"required": [
"page",
"clicks"
],
"properties": {
"page": {
"type": "string",
"maxLength": 2048
},
"clicks": {
"type": "number",
"minimum": 0
}
}
},
"maxItems": 5000,
"minItems": 1,
"description": "Search Console clicks per page."
},
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page, for example https://example.com/."
},
"mode": {
"enum": [
"ga4",
"consent",
"gsc_vs_ga4"
],
"type": "string",
"description": "Default ga4."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}Monitoring that runs on its own and posts changes to a webhook. Each kind takes action create (default), status or stop where it applies. Pick with mode: page = Watch one page (or a competitor page with competitor_of) for SEO changes. Needs url. page_status = Latest result of a page watch. Needs watch_id. page_stop = Stop a page watch. Needs watch_id. site_audit = Audit the whole site every 1, 7 or 30 days and alert on regressions. guard = Every 6 hours: robots.txt, sitemap, https, noindex and canonical on key pages, for deploy accidents. competitors = Weekly new, updated and removed pages from competitors' sitemaps, flagged by your topics.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address, for example https://example.com/pricing. |
| mode | string | Default page. |
| pages | array | Key pages to guard besides the home page (money pages first). |
| action | string | create (default), status or stop. |
| detail | string | brief = short summary. |
| topics | array | Your topics or keywords, to flag overlapping pages. |
| guard_id | string | For status and stop. |
| watch_id | string | For status and stop. |
Core Web Vitals from real Chrome users. Pick with mode: now = The latest field data for a page or site. Needs url. trend = Weekly history, before and after a change date. Needs url.
| Argument | Type | Description |
|---|---|---|
| url | string | Full address of the page, for example https://example.com/pricing. |
| mode | string | Default now. |
| detail | string | brief = short summary. |
| memory_key | string | site_memory key, records this call. |
| change_date | string | Optional date a speed fix went live, YYYY-MM-DD. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page, for example https://example.com/pricing."
},
"mode": {
"enum": [
"now",
"trend"
],
"type": "string",
"description": "Default now."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"change_date": {
"type": "string",
"maxLength": 2000,
"description": "Optional date a speed fix went live, YYYY-MM-DD."
}
},
"additionalProperties": false
}| array |
| memory_key | string | site_memory key, records this call. |
| competitors | array |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page, for example https://example.com/pricing."
},
"mode": {
"enum": [
"check",
"bots",
"gaps",
"citations"
],
"type": "string",
"description": "Default check."
},
"site": {
"type": "string",
"maxLength": 2000,
"description": "Your site, for example example.com."
},
"brand": {
"type": "string",
"maxLength": 2000,
"description": "Your brand name as people write it."
},
"pages": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
},
"grok": {
"type": "number",
"minimum": 0
},
"total": {
"type": "number",
"minimum": 0,
"description": "Total AI citations or appearances, if the source gives one number."
},
"gemini": {
"type": "number",
"minimum": 0
},
"chatgpt": {
"type": "number",
"minimum": 0
},
"copilot": {
"type": "number",
"minimum": 0
},
"perplexity": {
"type": "number",
"minimum": 0
},
"google_ai_mode": {
"type": "number",
"minimum": 0
},
"google_ai_overviews": {
"type": "number",
"minimum": 0
}
}
},
"maxItems": 8,
"minItems": 2
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"source": {
"enum": [
"ahrefs",
"semrush",
"other"
],
"type": "string",
"description": "Where the citation counts come from."
},
"responses": {
"type": "array",
"items": {
"type": "object",
"required": [
"question",
"response"
],
"properties": {
"links": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 40
},
"engine": {
"type": "string",
"maxLength": 2000
},
"volume": {
"type": "number",
"minimum": 0
},
"question": {
"type": "string",
"maxLength": 2000
},
"response": {
"type": "string",
"maxLength": 8000
},
"search_queries": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 20
}
}
},
"maxItems": 200,
"minItems": 1
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"competitors": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 2000
},
"domain": {
"type": "string",
"maxLength": 2000
}
}
},
"maxItems": 10
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page."
},
"mode": {
"enum": [
"questions",
"passages",
"format"
],
"type": "string",
"description": "Default questions."
},
"topic": {
"type": "string",
"maxLength": 2000,
"description": "The topic or main query, for example 'passport renewal'."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"question": {
"type": "string",
"maxLength": 2000,
"description": "The question people ask, for example 'how long does shipping take to Germany'."
},
"questions": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 25,
"minItems": 3,
"description": "The sub-questions an AI search engine would ask for the topic."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"competitors": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"description": "Optional: up to 2 pages that rank for the topic."
}
},
"additionalProperties": false
}| reason |
| string |
| Why a disavow is considered. |
| audit_id | string | Optional: a finished site audit, to match on page titles too. |
| mentions | array | Pages that mention the brand. |
| live_urls | array | Optional: your live pages, instead of reading the sitemap. |
| prospects | array |
| your_site | string | Your site or brand name, e.g. |
| memory_key | string | site_memory key, records this call. |
| competitors | array | Each competitor with its referring domains. |
| sender_name | string | Name to sign with. |
{
"type": "object",
"properties": {
"mode": {
"enum": [
"broken",
"opportunities",
"outreach",
"disavow"
],
"type": "string",
"description": "Default broken."
},
"rows": {
"type": "array",
"items": {
"type": "object"
},
"description": "Broken backlink rows, one per linking page."
},
"site": {
"type": "string",
"maxLength": 2000,
"description": "Optional: your site's address."
},
"brand": {
"type": "string",
"maxLength": 2000,
"description": "Brand name to look for in mention pages."
},
"yours": {
"type": "array",
"items": {
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"maxLength": 2000
},
"traffic": {
"type": "number"
},
"url_from": {
"type": "string",
"maxLength": 2048,
"description": "A page on that site that links to the competitor, if known."
},
"domain_rating": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
},
"maxItems": 5000,
"description": "Your own referring domains."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"format": {
"enum": [
"redirects",
"nginx",
"apache",
"nextjs",
"csv"
],
"type": "string",
"description": "Rule format, default redirects (Cloudflare Pages and Netlify _redirects)."
},
"reason": {
"enum": [
"manual_action",
"negative_seo",
"other"
],
"type": "string",
"description": "Why a disavow is considered."
},
"audit_id": {
"type": "string",
"maxLength": 2000,
"description": "Optional: a finished site audit, to match on page titles too."
},
"mentions": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 20,
"description": "Pages that mention the brand."
},
"live_urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 500,
"description": "Optional: your live pages, instead of reading the sitemap."
},
"prospects": {
"type": "array",
"items": {
"type": "object",
"required": [
"page",
"type",
"your_url"
],
"properties": {
"page": {
"type": "string",
"maxLength": 2048,
"description": "Their page."
},
"type": {
"enum": [
"broken",
"lost",
"mention",
"resource"
],
"type": "string"
},
"anchor": {
"type": "string",
"maxLength": 120
},
"contact": {
"type": "string",
"maxLength": 120,
"description": "Email or name if known."
},
"traffic": {
"type": "number",
"minimum": 0
},
"dead_url": {
"type": "string",
"maxLength": 2048,
"description": "For broken: the dead link on their page."
},
"your_url": {
"type": "string",
"maxLength": 2048,
"description": "Your page to link to."
},
"domain_rating": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
},
"maxItems": 100,
"minItems": 1
},
"your_site": {
"type": "string",
"maxLength": 2000,
"description": "Your site or brand name, e.g."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"competitors": {
"type": "array",
"items": {
"type": "object",
"required": [
"domain",
"referring_domains"
],
"properties": {
"domain": {
"type": "string",
"maxLength": 2000
},
"referring_domains": {
"type": "array",
"items": {
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"maxLength": 2000
},
"traffic": {
"type": "number"
},
"url_from": {
"type": "string",
"maxLength": 2048,
"description": "A page on that site that links to the competitor, if known."
},
"domain_rating": {
"type": "number",
"maximum": 100,
"minimum": 0
}
}
},
"maxItems": 3000
}
}
},
"maxItems": 5,
"description": "Each competitor with its referring domains."
},
"sender_name": {
"type": "string",
"maxLength": 80,
"description": "Name to sign with."
}
},
"additionalProperties": false
}{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page, for example https://example.com/pricing."
},
"mode": {
"enum": [
"focus",
"cannibalization"
],
"type": "string",
"description": "Default focus."
},
"rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"page": {
"type": "string",
"maxLength": 2048
},
"query": {
"type": "string",
"maxLength": 2000
},
"clicks": {
"type": "number"
},
"position": {
"type": "number"
},
"impressions": {
"type": "number"
}
}
},
"maxItems": 200,
"description": "Optional Search Console rows for the keyword, to find the competing pages and their positions."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"keyword": {
"type": "string",
"maxLength": 2000,
"description": "The search term the page should rank for, for example 'running shoes'."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"target_url": {
"type": "string",
"maxLength": 2048,
"description": "The page that should rank for it."
},
"competing_urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 5,
"description": "Other pages of the same site that compete for the keyword."
}
},
"additionalProperties": false
}| preview_url |
| string |
| The deploy preview URL. |
| bypass_token | string | Vercel protection bypass secret. |
| production_url | string | The live site. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address, for example https://example.com."
},
"mode": {
"enum": [
"pages",
"html",
"preview"
],
"type": "string",
"description": "Default pages."
},
"after": {
"type": "string",
"maxLength": 921600,
"description": "HTML after the change."
},
"paths": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 5,
"description": "Paths like /pricing, default /."
},
"before": {
"type": "string",
"maxLength": 921600,
"description": "HTML before the change."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"keyword": {
"type": "string",
"maxLength": 2000,
"description": "Optional search term to compare keyword use."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"competitors": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 3,
"minItems": 1,
"description": "Competitor page addresses."
},
"preview_url": {
"type": "string",
"maxLength": 2048,
"description": "The deploy preview URL."
},
"bypass_token": {
"type": "string",
"maxLength": 200,
"description": "Vercel protection bypass secret."
},
"production_url": {
"type": "string",
"maxLength": 2048,
"description": "The live site."
}
},
"additionalProperties": false
}| weeks |
| number |
| Weeks to plan, default 8. |
| detail | string | brief = short summary. |
| keyword | string | The search term the page should rank for. |
| queries | array | Search Console rows by query and page, for the site-wide check. |
| audit_id | string | Optional: a finished site audit, for internal link suggestions. |
| per_week | number | Items per week, default 2. |
| memory_key | string | site_memory key, records this call. |
| competitors | array | Pages that rank for the term. |
| webhook_url | string | Optional https Slack or Discord webhook for a Monday reminder; off stops it. |
| competitor_rows | array | Optional keyword gap: competitors' organic keywords (Ahrefs organic-keywords or Semrush domain_organic for each competitor, or Semrush keyword gap rows). |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Optional: your existing page for this term."
},
"html": {
"type": "string",
"maxLength": 921600,
"description": "The draft as HTML, title in <title> or <h1>."
},
"mode": {
"enum": [
"brief",
"topics",
"intent",
"voice",
"calendar",
"draft"
],
"type": "string",
"description": "Default brief."
},
"rows": {
"type": "array",
"items": {
"type": "object"
},
"description": "Search Console rows by query and page."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 5,
"minItems": 2,
"description": "The site's own best articles, ones that rank and that the owner likes."
},
"ideas": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 50,
"description": "Topics without a page yet."
},
"start": {
"type": "string",
"maxLength": 10,
"description": "First day, YYYY-MM-DD, default today."
},
"weeks": {
"type": "number",
"maximum": 52,
"minimum": 1,
"description": "Weeks to plan, default 8."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"keyword": {
"type": "string",
"maxLength": 2000,
"description": "The search term the page should rank for."
},
"queries": {
"type": "array",
"items": {
"type": "object",
"required": [
"query",
"page"
],
"properties": {
"page": {
"type": "string",
"maxLength": 2048
},
"query": {
"type": "string",
"maxLength": 2000
},
"clicks": {
"type": "number"
},
"position": {
"type": "number"
},
"impressions": {
"type": "number"
}
}
},
"maxItems": 1000,
"description": "Search Console rows by query and page, for the site-wide check."
},
"audit_id": {
"type": "string",
"maxLength": 2000,
"description": "Optional: a finished site audit, for internal link suggestions."
},
"per_week": {
"type": "number",
"maximum": 7,
"minimum": 1,
"description": "Items per week, default 2."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"competitors": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"description": "Pages that rank for the term."
},
"webhook_url": {
"type": "string",
"maxLength": 1000,
"description": "Optional https Slack or Discord webhook for a Monday reminder; off stops it."
},
"competitor_rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048
},
"volume": {
"type": "number"
},
"keyword": {
"type": "string",
"maxLength": 2000
},
"position": {
"type": "number"
},
"competitor": {
"type": "string",
"maxLength": 2000,
"description": "Competitor domain or ranking URL."
}
}
},
"maxItems": 1000,
"description": "Optional keyword gap: competitors' organic keywords (Ahrefs organic-keywords or Semrush domain_organic for each competitor, or Semrush keyword gap rows)."
}
},
"additionalProperties": false
}| Feed from create_dashboard_feed. |
| replace | boolean | Replace this connection's existing feed. |
| sources | array | What the user has connected in Claude. |
| bigquery | object | Optional, for ready SQL. |
| fix_log_id | string | Optional fix log from log_fix, to include shipped fixes. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"to": {
"type": "string",
"maxLength": 2048,
"description": "End date, YYYY-MM-DD."
},
"url": {
"type": "string",
"maxLength": 2048,
"description": "Home page of the site."
},
"from": {
"type": "string",
"maxLength": 2048,
"description": "Start date, YYYY-MM-DD."
},
"mode": {
"enum": [
"feed",
"data",
"build"
],
"type": "string",
"description": "Default feed."
},
"name": {
"type": "string",
"maxLength": 2000,
"description": "Optional name, for example the client's name."
},
"pages": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 10,
"description": "Optional key pages to track, up to 10."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"format": {
"enum": [
"blueprint",
"html"
],
"type": "string",
"description": "blueprint (default) for Claude Dashboards, or html for a complete, designed dashboard page filled with the feed's data, ready to show as an artifact."
},
"dataset": {
"enum": [
"overview",
"pages",
"issues",
"open_issues",
"vitals",
"ai_access",
"fixes"
],
"type": "string"
},
"feed_id": {
"type": "string",
"maxLength": 2000,
"description": "Feed from create_dashboard_feed."
},
"replace": {
"type": "boolean",
"description": "Replace this connection's existing feed."
},
"sources": {
"type": "array",
"items": {
"enum": [
"ga4",
"gsc",
"bigquery"
],
"type": "string"
},
"description": "What the user has connected in Claude."
},
"bigquery": {
"type": "object",
"properties": {
"project": {
"type": "string",
"maxLength": 2000
},
"ga4_dataset": {
"type": "string",
"maxLength": 2000,
"description": "For example analytics_123456789."
},
"gsc_dataset": {
"type": "string",
"maxLength": 2000,
"description": "For example searchconsole."
}
},
"description": "Optional, for ready SQL."
},
"fix_log_id": {
"type": "string",
"maxLength": 2000,
"description": "Optional fix log from log_fix, to include shipped fixes."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}| array |
| google_queries | array |
{
"type": "object",
"properties": {
"mode": {
"enum": [
"index_status",
"manual_action",
"bing"
],
"type": "string",
"description": "Default index_status."
},
"rows": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
},
"verdict": {
"type": "string",
"maxLength": 2000,
"description": "PASS, PARTIAL, FAIL or NEUTRAL."
},
"rich_issue": {
"type": "string",
"maxLength": 2000,
"description": "The issue from the Enhancements report, for example Missing field \"price\"."
},
"coverageState": {
"type": "string",
"maxLength": 2000,
"description": "Coverage state or the reason from the Pages report, for example 'Crawled - currently not indexed'."
},
"indexingState": {
"type": "string",
"maxLength": 2000
},
"lastCrawlTime": {
"type": "string",
"maxLength": 2000
},
"rich_severity": {
"type": "string",
"maxLength": 2000,
"description": "ERROR or WARNING."
},
"userCanonical": {
"type": "string",
"maxLength": 2000
},
"pageFetchState": {
"type": "string",
"maxLength": 2000
},
"robotsTxtState": {
"type": "string",
"maxLength": 2000
},
"googleCanonical": {
"type": "string",
"maxLength": 2000
},
"rich_result_type": {
"type": "string",
"maxLength": 2000,
"description": "From the Enhancements report export, for example Product snippets or FAQ."
},
"richResultsResult": {
"type": "object",
"description": "URL Inspection richResultsResult as returned (detectedItems with richResultType and item issues)."
}
}
},
"maxItems": 200,
"minItems": 1
},
"site": {
"type": "string",
"maxLength": 2000,
"description": "The site or Search Console property."
},
"action": {
"type": "string",
"maxLength": 200,
"description": "The manual action as Search Console shows it."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"issues": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"issue"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
},
"issue": {
"type": "string",
"maxLength": 200
}
}
},
"maxItems": 5000,
"description": "Bing crawl or index issues."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"sample_urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 10,
"description": "Example URLs Google listed."
},
"bing_queries": {
"type": "array",
"items": {
"type": "object",
"required": [
"query",
"clicks"
],
"properties": {
"query": {
"type": "string",
"maxLength": 2000
},
"clicks": {
"type": "number",
"minimum": 0
},
"position": {
"type": "number",
"minimum": 0
},
"impressions": {
"type": "number",
"minimum": 0
}
}
},
"maxItems": 5000
},
"google_queries": {
"type": "array",
"items": {
"type": "object",
"required": [
"query",
"clicks"
],
"properties": {
"query": {
"type": "string",
"maxLength": 2000
},
"clicks": {
"type": "number",
"minimum": 0
},
"position": {
"type": "number",
"minimum": 0
},
"impressions": {
"type": "number",
"minimum": 0
}
}
},
"maxItems": 5000
}
},
"additionalProperties": false
}| urls | array | Article pages to check. |
| detail | string | brief = short summary. |
| drop_date | string | Optional first day of the drop, YYYY-MM-DD, to check Google updates around it. |
| fix_log_id | string | Optional fix log from log_fix, to spot undone fixes on losing pages. |
| memory_key | string | site_memory key, records this call. |
| brand_terms | array | Optional brand names, handled apart. |
| search_type | string | Search Console search type of the rows, default web. |
{
"type": "object",
"properties": {
"ads": {
"type": "array",
"items": {
"type": "object",
"required": [
"term",
"cost"
],
"properties": {
"cost": {
"type": "number",
"minimum": 0
},
"term": {
"type": "string",
"maxLength": 2000
},
"clicks": {
"type": "number",
"minimum": 0
},
"conversions": {
"type": "number",
"minimum": 0
}
}
},
"maxItems": 10000,
"minItems": 1,
"description": "Google Ads search terms."
},
"gsc": {
"type": "array",
"items": {
"type": "object",
"required": [
"query",
"position"
],
"properties": {
"page": {
"type": "string",
"maxLength": 2048
},
"query": {
"type": "string",
"maxLength": 2000
},
"clicks": {
"type": "number",
"minimum": 0
},
"position": {
"type": "number",
"minimum": 0
}
}
},
"maxItems": 10000,
"minItems": 1,
"description": "Search Console queries."
},
"mode": {
"enum": [
"ctr_gaps",
"striking_distance",
"content_decay",
"traffic_drop",
"prune",
"discover",
"paid_organic",
"anomalies",
"ai_queries"
],
"type": "string",
"description": "Default ctr_gaps."
},
"rows": {
"type": "array",
"items": {
"type": "object"
},
"description": "Search Console rows for one period (28 days works well)."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 5,
"description": "Article pages to check."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"drop_date": {
"type": "string",
"maxLength": 10,
"description": "Optional first day of the drop, YYYY-MM-DD, to check Google updates around it."
},
"fix_log_id": {
"type": "string",
"maxLength": 2000,
"description": "Optional fix log from log_fix, to spot undone fixes on losing pages."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"brand_terms": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 20,
"description": "Optional brand names, handled apart."
},
"search_type": {
"enum": [
"web",
"discover",
"news",
"image",
"video"
],
"type": "string",
"description": "Search Console search type of the rows, default web."
}
},
"additionalProperties": false
}| string |
| site_memory key, records this call. |
| shipped_at | string | Date the fixes went live, YYYY-MM-DD. |
{
"type": "object",
"properties": {
"mode": {
"enum": [
"log",
"report"
],
"type": "string",
"description": "Default log."
},
"brand": {
"type": "string",
"maxLength": 2000,
"description": "For the report: your agency name for the header."
},
"fixes": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"field",
"new"
],
"properties": {
"new": {
"type": "string",
"maxLength": 2048,
"description": "Value after the fix, used to check it stays live."
},
"old": {
"type": "string",
"maxLength": 2048,
"description": "Value before the fix, used for rollback. Empty if there was none."
},
"ref": {
"type": "string",
"maxLength": 2000,
"description": "Optional link, e.g. the pull request."
},
"url": {
"type": "string",
"maxLength": 2048,
"description": "Page the fix was made on (for a redirect: the old URL)."
},
"via": {
"enum": [
"pull_request",
"wordpress",
"edge",
"cms",
"manual"
],
"type": "string",
"description": "How the fix shipped."
},
"note": {
"type": "string",
"maxLength": 2000,
"description": "Optional short note, e.g. the issue code it fixed."
},
"field": {
"enum": [
"title",
"meta_description",
"canonical",
"robots",
"h1",
"og_title",
"og_image",
"hreflang",
"jsonld",
"redirect",
"other"
],
"type": "string",
"description": "What was changed. hreflang: new is the language code; jsonld: new is the schema type, e.g. FAQPage; redirect: new is the target URL."
}
},
"additionalProperties": false
},
"maxItems": 30,
"minItems": 1
},
"month": {
"type": "string",
"maxLength": 2000,
"description": "For the report: YYYY-MM."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"format": {
"enum": [
"status",
"report",
"annotations"
],
"type": "string",
"description": "status (default), a client report, or GA4 annotations (one per ship date) for the Admin API."
},
"verify": {
"type": "boolean",
"description": "Check the live pages now (4 pages per call)."
},
"webhook": {
"type": "string",
"maxLength": 2048,
"description": "Optional https URL (Slack, Discord, Zapier, n8n, a GitHub Action) that gets the restore code when a fix is undone."
},
"fix_log_id": {
"type": "string",
"maxLength": 2000,
"description": "Add to an existing log."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"shipped_at": {
"type": "string",
"maxLength": 2000,
"description": "Date the fixes went live, YYYY-MM-DD."
}
},
"additionalProperties": false
}| site_key | string | The site key from the plugin, wpk_... |
| change_id | string | Status of an earlier send. |
| framework | string | With platform git: the site's framework. |
| memory_key | string | site_memory key, records this call. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of the page, for example https://example.com/pricing."
},
"alts": {
"type": "array",
"items": {
"type": "object",
"required": [
"src",
"alt"
],
"properties": {
"alt": {
"type": "string",
"maxLength": 300
},
"src": {
"type": "string",
"maxLength": 2000
}
}
},
"maxItems": 50,
"description": "Step 2: the alt text per image src."
},
"mode": {
"enum": [
"fixes",
"alt_texts",
"web_vitals",
"wordpress"
],
"type": "string",
"description": "Default fixes."
},
"note": {
"type": "string",
"maxLength": 300,
"description": "Optional reason shown to the site owner."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"changes": {
"type": "array",
"items": {
"type": "object",
"required": [
"field",
"value"
],
"properties": {
"field": {
"enum": [
"title",
"meta_description",
"canonical",
"og_title",
"og_description",
"og_image",
"jsonld",
"image_alt",
"post_content",
"new_post"
],
"type": "string"
},
"value": {}
}
},
"maxItems": 20,
"description": "Optional field and new value pairs."
},
"failing": {
"type": "array",
"items": {
"enum": [
"LCP",
"INP",
"CLS",
"FCP",
"TTFB"
],
"type": "string"
},
"maxItems": 5,
"description": "Metrics that fail for real users, if known."
},
"platform": {
"enum": [
"html",
"wordpress",
"git",
"cloudflare",
"webflow",
"wix",
"shopify",
"storyblok",
"sanity",
"contentful",
"strapi",
"ghost",
"magento"
],
"type": "string",
"description": "html (default) for code to paste; wordpress, webflow, wix, shopify, storyblok, sanity, contentful, strapi, ghost or magento for a plan with the exact fields and"
},
"site_key": {
"type": "string",
"maxLength": 60,
"description": "The site key from the plugin, wpk_..."
},
"change_id": {
"type": "string",
"maxLength": 40,
"description": "Status of an earlier send."
},
"framework": {
"enum": [
"auto",
"nextjs-app",
"nextjs-pages",
"nuxt",
"sveltekit",
"astro",
"angular",
"react",
"vue",
"html"
],
"type": "string",
"description": "With platform git: the site's framework."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
}
},
"additionalProperties": false
}| array |
| Optional. Pages that matter most, for example top pages by clicks or revenue. |
{
"type": "object",
"properties": {
"mode": {
"enum": [
"suggest",
"equity"
],
"type": "string",
"description": "Default suggest."
},
"topic": {
"type": "string",
"maxLength": 2000,
"description": "Topic or main keyword of the target page."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"phrases": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80
},
"maxItems": 6,
"description": "Optional: phrases to turn into the link, besides the anchor text, for example natural variants."
},
"audit_id": {
"type": "string",
"maxLength": 2000,
"description": "Id of a completed site audit."
},
"platform": {
"enum": [
"cloudflare",
"wordpress",
"git"
],
"type": "string",
"description": "Optional: also return the links ready to apply: a Cloudflare Worker that links the first mention on each page, a WordPress edit plan, or the edits for the code."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"target_url": {
"type": "string",
"maxLength": 2048,
"description": "Page that should receive links."
},
"important_urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 50,
"description": "Optional. Pages that matter most, for example top pages by clicks or revenue."
}
},
"additionalProperties": false
}| array |
| business | string | Business name to sign with. |
| memory_key | string | site_memory key, records this call. |
| gbp_profile | object | Optional: the Google Business Profile of this location, from the user's GBP connector or typed by the user, to compare with the site. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The home page, a location page or the locations overview page."
},
"city": {
"type": "string",
"maxLength": 80,
"description": "Main city, left out when matching terms to pages."
},
"grid": {
"type": "array",
"items": {
"type": "object",
"required": [
"keyword",
"rank"
],
"properties": {
"area": {
"type": "string",
"maxLength": 120,
"description": "Area, neighbourhood or point label."
},
"rank": {
"type": "number",
"minimum": 0,
"description": "Map rank, 0 or above 20 for not found."
},
"keyword": {
"type": "string",
"maxLength": 200
}
}
},
"maxItems": 5000,
"description": "Optional geo-grid rankings."
},
"mode": {
"enum": [
"check",
"reviews",
"demand"
],
"type": "string",
"description": "Default check."
},
"pages": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 2000,
"description": "The site's page URLs, e.g."
},
"terms": {
"type": "array",
"items": {
"type": "object",
"required": [
"keyword"
],
"properties": {
"keyword": {
"type": "string",
"maxLength": 200
},
"impressions": {
"type": "number",
"minimum": 0
}
}
},
"maxItems": 2000,
"description": "Search terms from the Business Profile performance report."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"contact": {
"type": "string",
"maxLength": 160,
"description": "Where unhappy customers can reach you, e.g."
},
"reviews": {
"type": "array",
"items": {
"type": "object",
"required": [
"rating"
],
"properties": {
"date": {
"type": "string",
"maxLength": 2000
},
"text": {
"type": "string",
"maxLength": 4000
},
"author": {
"type": "string",
"maxLength": 120
},
"rating": {
"type": "number",
"maximum": 5,
"minimum": 1
},
"replied": {
"type": "boolean"
},
"review_id": {
"type": "string",
"maxLength": 300
}
}
},
"maxItems": 500,
"minItems": 1
},
"business": {
"type": "string",
"maxLength": 120,
"description": "Business name to sign with."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"gbp_profile": {
"type": "object",
"properties": {
"city": {
"type": "string",
"maxLength": 2000
},
"hours": {
"type": "array",
"items": {
"type": "object",
"required": [
"day"
],
"properties": {
"day": {
"type": "string",
"maxLength": 2000,
"description": "Monday to Sunday."
},
"opens": {
"type": "string",
"maxLength": 2000,
"description": "HH:MM"
},
"closes": {
"type": "string",
"maxLength": 2000,
"description": "HH:MM"
}
}
},
"maxItems": 14,
"description": "Opening hours per day; leave a day out when closed."
},
"phone": {
"type": "string",
"maxLength": 2000
},
"title": {
"type": "string",
"maxLength": 2000
},
"street": {
"type": "string",
"maxLength": 2000
},
"website": {
"type": "string",
"maxLength": 2000,
"description": "The website link on the profile."
},
"postcode": {
"type": "string",
"maxLength": 2000
},
"primary_category": {
"type": "string",
"maxLength": 2000,
"description": "For example Dentist, Italian restaurant, Plumber."
}
},
"description": "Optional: the Google Business Profile of this location, from the user's GBP connector or typed by the user, to compare with the site."
}
},
"additionalProperties": false
}| watch_ids |
| array |
| Optional watch ids, to list what changed on each page and when. |
| fix_log_id | string | Optional fix log from log_fix: takes the fix date from it and saves the result per fix, with a rollback plan for fixes that did worse. |
| memory_key | string | site_memory key, records this call. |
| brand_terms | array | Brand and product names, and misspellings. |
| rows_before | array | Optional same rows from an earlier period. |
| your_domain | string | Your domain, e.g. example.com. |
{
"type": "object",
"properties": {
"days": {
"type": "integer",
"maximum": 365,
"minimum": 7,
"description": "Length of each period in days."
},
"mode": {
"enum": [
"impact",
"ai_citations",
"ai_referrals",
"brand_split",
"share_of_voice"
],
"type": "string",
"description": "Default impact."
},
"rows": {
"type": "array",
"items": {
"type": "object"
}
},
"pages": {
"type": "array",
"items": {
"type": "object"
}
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"source": {
"type": "string",
"maxLength": 2048,
"description": "Where the counts come from, for example Ahrefs Brand Radar."
},
"fix_date": {
"type": "string",
"maxLength": 2000,
"description": "Date the fixes went live, YYYY-MM-DD."
},
"watch_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 20,
"description": "Optional watch ids, to list what changed on each page and when."
},
"fix_log_id": {
"type": "string",
"maxLength": 2000,
"description": "Optional fix log from log_fix: takes the fix date from it and saves the result per fix, with a rollback plan for fixes that did worse."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"brand_terms": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 20,
"minItems": 1,
"description": "Brand and product names, and misspellings."
},
"rows_before": {
"type": "array",
"items": {
"type": "object"
},
"maxItems": 10000,
"description": "Optional same rows from an earlier period."
},
"your_domain": {
"type": "string",
"maxLength": 2000,
"description": "Your domain, e.g. example.com."
}
},
"additionalProperties": false
}| pattern |
| string |
| The new value with {title} or {description} as placeholders. |
| new_site | string | New site address, to read its sitemap instead of new_urls. |
| new_urls | array |
| old_site | string | Old site address, to read its sitemap instead of old_urls. |
| old_urls | array |
| memory_key | string | site_memory key, records this call. |
| start_date | string | Optional planned start, YYYY-MM-DD. |
{
"type": "object",
"properties": {
"mode": {
"enum": [
"redirects",
"split_test",
"sprint"
],
"type": "string",
"description": "Default redirects."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 500,
"minItems": 20,
"description": "Pages of one template."
},
"field": {
"enum": [
"title",
"description"
],
"type": "string",
"description": "What to change."
},
"fixes": {
"type": "array",
"items": {
"type": "object",
"required": [
"title"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
},
"role": {
"enum": [
"dev",
"content",
"outreach"
],
"type": "string"
},
"title": {
"type": "string",
"maxLength": 200
},
"detail": {
"type": "string",
"maxLength": 600
},
"effort": {
"enum": [
"small",
"medium",
"large"
],
"type": "string"
},
"impact": {
"type": "number",
"minimum": 0,
"description": "Clicks or revenue at stake, any unit, used to rank."
},
"severity": {
"enum": [
"error",
"warning",
"info"
],
"type": "string"
}
}
},
"maxItems": 300,
"minItems": 1
},
"hours": {
"type": "object",
"properties": {
"dev": {
"type": "number",
"maximum": 80,
"minimum": 0
},
"content": {
"type": "number",
"maximum": 80,
"minimum": 0
},
"outreach": {
"type": "number",
"maximum": 80,
"minimum": 0
}
},
"description": "Hours per week per role, default 8 each.",
"additionalProperties": false
},
"weeks": {
"type": "number",
"maximum": 12,
"minimum": 1,
"description": "Weeks to plan, default 4."
},
"clicks": {
"type": "array",
"items": {
"type": "object",
"required": [
"url",
"clicks"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048
},
"clicks": {
"type": "number",
"minimum": 0
}
}
},
"maxItems": 500,
"description": "Optional clicks per page for a balanced split."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"format": {
"enum": [
"redirects",
"nginx",
"apache",
"nextjs",
"csv"
],
"type": "string",
"description": "Output format, default redirects (Cloudflare Pages and Netlify)."
},
"pattern": {
"type": "string",
"maxLength": 200,
"description": "The new value with {title} or {description} as placeholders."
},
"new_site": {
"type": "string",
"maxLength": 2048,
"description": "New site address, to read its sitemap instead of new_urls."
},
"new_urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 500
},
"old_site": {
"type": "string",
"maxLength": 2048,
"description": "Old site address, to read its sitemap instead of old_urls."
},
"old_urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 500
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"start_date": {
"type": "string",
"maxLength": 2000,
"description": "Optional planned start, YYYY-MM-DD."
}
},
"additionalProperties": false
}| audit_id | string | The id returned by start_site_audit. |
| max_pages | integer | How many pages to audit, default 10, at most 25. |
| memory_key | string | site_memory key, records this call. |
| previous_audit_id | string | Optional: the audit to compare with. |
| competitor_audit_id | string | Optional: a finished audit of a competitor's site, to compare the two sites side by side instead of over time. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address, for example https://example.com."
},
"mode": {
"enum": [
"start",
"continue",
"import",
"compare",
"report"
],
"type": "string",
"description": "Default start."
},
"note": {
"type": "string",
"maxLength": 600,
"description": "Optional short note for the reader, shown at the top."
},
"brand": {
"type": "string",
"maxLength": 60,
"description": "Optional agency or team name to show instead of OnPage.dev."
},
"links": {
"type": "array",
"items": {
"type": "object",
"required": [
"from",
"to"
],
"properties": {
"to": {
"type": "string",
"maxLength": 2048
},
"from": {
"type": "string",
"maxLength": 2048
}
}
},
"maxItems": 10000,
"description": "Optional internal links, for link equity, orphans and internal link suggestions."
},
"pages": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"h1": {
"type": "string",
"maxLength": 2000,
"description": "First H1."
},
"url": {
"type": "string",
"maxLength": 2048,
"description": "Page address (Screaming Frog: Address; Ahrefs: URL)."
},
"depth": {
"type": "number",
"description": "Clicks from the home page."
},
"title": {
"type": "string",
"maxLength": 2000
},
"status": {
"type": "number",
"description": "HTTP status code."
},
"inlinks": {
"type": "number",
"description": "Unique internal links pointing at the page."
},
"noindex": {
"type": "boolean",
"description": "true when meta robots or X-Robots-Tag says noindex."
},
"h1_count": {
"type": "number"
},
"canonical": {
"type": "string",
"maxLength": 2000
},
"word_count": {
"type": "number"
},
"image_count": {
"type": "number"
},
"redirect_to": {
"type": "string",
"maxLength": 2000,
"description": "Where a 3xx goes."
},
"meta_description": {
"type": "string",
"maxLength": 2000
},
"images_missing_alt": {
"type": "number"
}
}
},
"maxItems": 500,
"minItems": 1,
"description": "One row per crawled page."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"source": {
"type": "string",
"maxLength": 2048,
"description": "Where the rows come from, for example Screaming Frog or Ahrefs Site Audit."
},
"audit_id": {
"type": "string",
"maxLength": 2000,
"description": "The id returned by start_site_audit."
},
"max_pages": {
"type": "integer",
"maximum": 25,
"minimum": 2,
"description": "How many pages to audit, default 10, at most 25."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"previous_audit_id": {
"type": "string",
"maxLength": 2000,
"description": "Optional: the audit to compare with."
},
"competitor_audit_id": {
"type": "string",
"maxLength": 2000,
"description": "Optional: a finished audit of a competitor's site, to compare the two sites side by side instead of over time."
}
},
"additionalProperties": false
}| Id of a completed site audit. |
| selector | string | CSS selector, for example .price, h1 or link[rel=canonical]. |
| attribute | string | With selector: read this attribute instead of the text, for example href or content. |
| memory_key | string | site_memory key, records this call. |
| sitemap_urls | array | Optional: the URLs from the site's sitemap, to find pages bots never crawl. |
{
"type": "object",
"properties": {
"log": {
"type": "string",
"maxLength": 819200,
"description": "Raw access log lines, one request per line."
},
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address of one language version of the page."
},
"mode": {
"enum": [
"hreflang",
"parameters",
"duplicates",
"extract",
"logs"
],
"type": "string",
"description": "Default hreflang."
},
"urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"description": "Optional extra URLs, for example from server logs or Search Console."
},
"regex": {
"type": "string",
"maxLength": 2000,
"description": "A regular expression; the first group is returned if there is one, otherwise the whole match."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"jsonld": {
"type": "string",
"maxLength": 1048576,
"description": "A JSON-LD path: the @type, then the properties, for example Product.offers.price or Article.author.name."
},
"audit_id": {
"type": "string",
"maxLength": 2000,
"description": "Id of a completed site audit."
},
"selector": {
"type": "string",
"maxLength": 2000,
"description": "CSS selector, for example .price, h1 or link[rel=canonical]."
},
"attribute": {
"type": "string",
"maxLength": 2000,
"description": "With selector: read this attribute instead of the text, for example href or content."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"sitemap_urls": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 2000,
"description": "Optional: the URLs from the site's sitemap, to find pages bots never crawl."
}
},
"additionalProperties": false
}| Optional https webhook for the changes (Slack and Discord work). |
| tracker_rows | array | Ahrefs Rank Tracker or Semrush Position Tracking rows. |
| money_keywords | array | Optional keywords you always want followed. |
{
"type": "object",
"properties": {
"site": {
"type": "string",
"maxLength": 2000,
"description": "Your site. Needed on the first run."
},
"action": {
"enum": [
"run",
"status",
"stop"
],
"type": "string",
"description": "run (default), status or stop."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"gsc_rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"page": {
"type": "string",
"maxLength": 2048
},
"query": {
"type": "string",
"maxLength": 2000
},
"clicks": {
"type": "number"
},
"position": {
"type": "number"
},
"impressions": {
"type": "number"
}
}
},
"maxItems": 2000,
"description": "Search Console rows by query and page for the period."
},
"fix_log_id": {
"type": "string",
"maxLength": 2000,
"description": "Optional fix log (log_fix) whose pages count as work done."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"tracker_id": {
"type": "string",
"maxLength": 2000,
"description": "From the first run. Leave out to create a tracker."
},
"conversions": {
"type": "array",
"items": {
"type": "object",
"required": [
"page"
],
"properties": {
"page": {
"type": "string",
"maxLength": 2048
},
"revenue": {
"type": "number"
},
"conversions": {
"type": "number"
}
}
},
"maxItems": 500,
"description": "Optional GA4 key events or revenue per landing page."
},
"webhook_url": {
"type": "string",
"maxLength": 2048,
"description": "Optional https webhook for the changes (Slack and Discord work)."
},
"tracker_rows": {
"type": "array",
"items": {
"type": "object",
"properties": {
"cpc": {
"type": "number"
},
"url": {
"type": "string",
"maxLength": 2048,
"description": "Ranking URL (Semrush: landing_page)."
},
"tags": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
}
},
"device": {
"type": "string",
"maxLength": 2000
},
"volume": {
"type": "number"
},
"keyword": {
"type": "string",
"maxLength": 2000
},
"traffic": {
"type": "number"
},
"location": {
"type": "string",
"maxLength": 2000
},
"position": {
"type": "number"
},
"is_branded": {
"type": "boolean"
},
"landing_page": {
"type": "string",
"maxLength": 2000
},
"is_commercial": {
"type": "boolean"
},
"serp_features": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
}
},
"is_transactional": {
"type": "boolean"
}
},
"description": "Ahrefs Rank Tracker (rank-tracker-overview) or Semrush Position Tracking rows."
},
"maxItems": 1000,
"description": "Ahrefs Rank Tracker or Semrush Position Tracking rows."
},
"money_keywords": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2000
},
"maxItems": 100,
"description": "Optional keywords you always want followed."
}
},
"additionalProperties": false
}| max_pages |
| number |
| Pages per audit, default 25. |
| every_days | number | How often, default 7. |
| memory_key | string | site_memory key, records this call. |
| competitors | array | Competitor home pages. |
| schedule_id | string | For status and stop. |
| webhook_url | string | Optional https URL that receives a JSON POST when something changes, for example a Slack or Discord incoming webhook. |
| competitor_of | string | Optional: your own page. |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "Full address, for example https://example.com/pricing."
},
"mode": {
"enum": [
"page",
"page_status",
"page_stop",
"site_audit",
"guard",
"competitors"
],
"type": "string",
"description": "Default page."
},
"pages": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 5,
"description": "Key pages to guard besides the home page (money pages first)."
},
"action": {
"enum": [
"create",
"status",
"stop"
],
"type": "string",
"description": "create (default), status or stop."
},
"detail": {
"enum": [
"full",
"brief"
],
"type": "string",
"description": "brief = short summary."
},
"topics": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 30,
"description": "Your topics or keywords, to flag overlapping pages."
},
"guard_id": {
"type": "string",
"maxLength": 2000,
"description": "For status and stop."
},
"watch_id": {
"type": "string",
"maxLength": 2000,
"description": "For status and stop."
},
"max_pages": {
"type": "number",
"maximum": 25,
"minimum": 2,
"description": "Pages per audit, default 25."
},
"every_days": {
"enum": [
1,
7,
30
],
"type": "number",
"description": "How often, default 7."
},
"memory_key": {
"type": "string",
"maxLength": 80,
"description": "site_memory key, records this call."
},
"competitors": {
"type": "array",
"items": {
"type": "string",
"maxLength": 2048
},
"maxItems": 3,
"minItems": 1,
"description": "Competitor home pages."
},
"schedule_id": {
"type": "string",
"maxLength": 2000,
"description": "For status and stop."
},
"webhook_url": {
"type": "string",
"maxLength": 2048,
"description": "Optional https URL that receives a JSON POST when something changes, for example a Slack or Discord incoming webhook."
},
"competitor_of": {
"type": "string",
"maxLength": 2048,
"description": "Optional: your own page."
}
},
"additionalProperties": false
}