{"openapi":"3.0.0","info":{"title":"SnowSEO API","description":"API documentation for SnowSEO","version":"1.0.0"},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","name":"x-api-key","in":"header"},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{}},"paths":{"/docs/json":{"get":{"tags":["Utilities"],"description":"OpenAPI specification for SnowSEO API.","responses":{"200":{"description":"Default Response"}}}},"/v3/api/auth/{wildcard}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"wildcard","required":true}],"responses":{"200":{"description":"Default Response"}}},"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"wildcard","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/.well-known/oauth-authorization-server":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/.well-known/oauth-authorization-server/{wildcard}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"wildcard","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/.well-known/openid-configuration":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/.well-known/openid-configuration/{wildcard}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"wildcard","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/health":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/refresh":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/overview":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/counts":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/runs":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/schedulers":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/test":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/queue-names":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/queues":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/metrics":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/activity":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/queues/{name}/jobs":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/jobs/{queue}/{id}/logs":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"queue","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/jobs/{queue}/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"queue","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/jobs/{queue}/{id}/retry":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"queue","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/jobs/{queue}/{id}/remove":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"queue","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/jobs/{queue}/{id}/promote":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"queue","required":true},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/schedulers/{queue}/{key}/run":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"queue","required":true},{"schema":{"type":"string"},"in":"path","name":"key","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/search":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/tags/{field}/values":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"field","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/queues/{name}/clean":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/bulk/retry":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/bulk/delete":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/bulk/promote":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/queues/{name}/pause":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/queues/{name}/resume":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/flows":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/api/flows/{queueName}/{jobId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"queueName","required":true},{"schema":{"type":"string"},"in":"path","name":"jobId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/config":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/assets/{file}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"file","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/app-icon.svg":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/queues/workbench/{wildcard}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"wildcard","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/activity-feed/":{"get":{"operationId":"getActivityFeed","summary":"Get activity feed","tags":["Activity Feed"],"description":"Returns the activity feed for a team.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"integer","minimum":1,"maximum":50},"in":"query","name":"limit","required":false,"description":"Max number of items (default 15, max 50)"}],"x-mcp":{"name":"activity_feed"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","type","title","description","timestamp"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["article-published","article-updated","keyword-tracked","prompt-tracked","audit-completed","onboarding-step","onboarding-complete"]},"title":{"type":"string"},"description":{"type":"string"},"timestamp":{"type":"string"},"metadata":{"type":"object","additionalProperties":true}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/admin/cms-editor/media":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/admin/cms-editor/copilot":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/ai-models/":{"get":{"operationId":"listAiVisibilityModels","summary":"List AI visibility models","tags":["AI Models"],"description":"Lists available AI visibility models for a team, including active state and plan eligibility.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true}],"x-mcp":{"name":"ai_visibility_models"},"responses":{"200":{"description":"Default Response"}}}},"/v3/ai-models/{modelId}":{"patch":{"operationId":"updateAiVisibilityModel","summary":"Update AI visibility model state","tags":["AI Models"],"description":"Enables or disables one AI visibility model for a team.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId","isActive"],"properties":{"teamId":{"type":"string"},"isActive":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"modelId","required":true}],"x-mcp":{"name":"update_ai_visibility_model"},"responses":{"200":{"description":"Default Response"}}}},"/v3/ai-models/refresh-interval":{"get":{"operationId":"getAiVisibilityRefreshInterval","summary":"Get AI visibility refresh interval","tags":["AI Models"],"description":"Returns the team's effective prompt tracking refresh cadence (days), the plan floor, the selectable options, and any custom override.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true}],"x-mcp":{"name":"ai_visibility_refresh_interval"},"responses":{"200":{"description":"Default Response"}}},"patch":{"operationId":"updateAiVisibilityRefreshInterval","summary":"Set AI visibility refresh interval","tags":["AI Models"],"description":"Sets the team's custom prompt tracking refresh cadence (days). Pass null to clear and follow the plan floor. The value must be a selectable option ≥ the plan floor.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId"],"properties":{"teamId":{"type":"string"},"interval":{"type":"integer","nullable":true}}}}}},"x-mcp":{"name":"update_ai_visibility_refresh_interval"},"responses":{"200":{"description":"Default Response"}}}},"/v3/ai-tracker/prompts":{"post":{"operationId":"createTrackedPrompts","summary":"Create or bulk-create tracked prompts","tags":["AI Tracker"],"description":"Track AI-visibility prompts. CONSUMES CREDITS (each prompt is run against the AI platforms): always ask the user for permission before calling this. Single mode: creates one prompt and returns its record. Bulk mode: pass `items` array to create multiple at once. `isEnabled`, `isBranded` and `region` apply to `prompt` and are also the defaults for every entry in `items`, so bulk callers set them once at the top level.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","anyOf":[{"required":["prompt"]},{"required":["items"]}],"properties":{"teamId":{"type":"string"},"prompt":{"type":"string","maxLength":600,"description":"Single prompt text"},"isEnabled":{"type":"boolean","description":"Whether to start tracking straight away. Defaults to true. Applies to `prompt` and is the default for every entry in `items` (an entry's own `isEnabled` wins). Pass false to add prompts without tracking them: nothing runs and no credits are spent until they are enabled, and prompts that already exist but are paused stay paused."},"isBranded":{"type":"boolean","description":"Marks the prompt as brand-specific. Applies to `prompt` and is the default for every entry in `items`. Detected from the prompt text when omitted."},"region":{"type":"object","nullable":true,"additionalProperties":true,"description":"Optional region targeting. Applies to `prompt` and is the default for every entry in `items`. Omit for the team's default region, or pass null to track worldwide."},"items":{"type":"array","description":"Bulk prompt items","items":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","maxLength":600},"isEnabled":{"type":"boolean"},"isBranded":{"type":"boolean"},"region":{"type":"object","nullable":true,"additionalProperties":true,"description":"Region targeting for this entry, overriding the top-level `region`. Omit to inherit it, or pass null to track this entry worldwide."}}}},"enqueue":{"type":"boolean","description":"When false, skips only the immediate run. The prompt is still tracked, so the refresh cron picks it up and bills for it on its next tick. To add a prompt without tracking it, use `isEnabled: false` instead."}}}}}},"x-mcp":{"name":"track_prompts"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}},"patch":{"operationId":"updateTrackedPrompts","summary":"Update one or many tracked prompts","tags":["AI Tracker"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","anyOf":[{"required":["id"]},{"required":["promptIds"]}],"properties":{"teamId":{"type":"string"},"id":{"type":"string","description":"Single prompt ID"},"promptIds":{"type":"array","items":{"type":"string"},"description":"Multiple prompt IDs"},"isEnabled":{"type":"boolean"},"isBranded":{"type":"boolean"},"isPinned":{"type":"boolean"},"prompt":{"type":"string","maxLength":600},"enqueue":{"type":"boolean","description":"When false, enable the prompt without immediately running it."}}}}}},"x-mcp":{"name":"update_tracked_prompts"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"enabled":{"type":"number"},"enqueued":{"type":"number"},"skipped":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}},"delete":{"operationId":"deleteTrackedPrompts","summary":"Delete one or many tracked prompts","tags":["AI Tracker"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","anyOf":[{"required":["id"]},{"required":["promptIds"]}],"properties":{"teamId":{"type":"string"},"id":{"type":"string","description":"Single prompt ID"},"promptIds":{"type":"array","items":{"type":"string"},"description":"Multiple prompt IDs"}}}}}},"x-mcp":{"name":"delete_tracked_prompts"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/prompts/{id}/refresh":{"post":{"operationId":"refreshTrackedPrompt","summary":"Refresh a prompt and all its region variants","tags":["AI Tracker"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"x-mcp":{"name":"refresh_tracked_prompt"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"enqueued":{"type":"number"},"error":{"type":"string"},"nextRunAt":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/prompts/refresh":{"post":{"operationId":"refreshTrackedPrompts","summary":"Refresh many prompts and their region variants","tags":["AI Tracker"],"description":"Re-runs every enabled region variant of the given prompts. CONSUMES CREDITS (each variant is run against every active AI platform): always ask the user for permission before calling this.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["promptIds"],"properties":{"teamId":{"type":"string"},"promptIds":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Prompt IDs to refresh"}}}}}},"x-mcp":{"name":"refresh_tracked_prompts"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"enqueued":{"type":"number"},"error":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/prompts/{id}/responses":{"delete":{"operationId":"deletePromptResponses","summary":"Delete specific responses for a prompt","tags":["AI Tracker"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["responseIds"],"properties":{"teamId":{"type":"string"},"responseIds":{"type":"array","items":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"x-mcp":{"name":"delete_prompt_responses"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/fan-out-queries":{"post":{"operationId":"fanOutQueries","summary":"Generate query variations from a seed query","tags":["AI Tracker"],"description":"Uses AI to fan out a seed query into multiple search variations.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["seedQuery"],"properties":{"teamId":{"type":"string"},"seedQuery":{"type":"string","description":"The base query to expand"},"count":{"type":"integer","minimum":1,"maximum":20,"default":10,"description":"Number of variations to generate (max 20, default 10)"}}}}}},"x-mcp":{"name":"ai_visibility_fan_out_queries"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"queries":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/filter-options":{"get":{"operationId":"getAiVisibilityFilterOptions","summary":"AI Visibility filter dropdown options","tags":["AI Tracker"],"description":"The valid values for the scope filters every ai_visibility_* tool accepts: AI platforms, country codes and competitor names. The competitor list is every brand ever seen in the team's AI answers, so it can run to thousands - narrow it with search, or raise limit only when you truly need the whole list.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Case-insensitive substring match on competitor name."},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Max competitors to return, or 'all'. Defaults to 25. The response reports competitorsTotal and competitorsTruncated. Platforms and countries are never capped (both are small, bounded lists)."}],"x-mcp":{"name":"ai_visibility_filters"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/summary":{"get":{"operationId":"getAiVisibilitySummary","summary":"AI visibility headline metrics","tags":["AI Tracker"],"description":"Headline AI-visibility numbers for a team: visibility, share of voice, citation share and sentiment (each with a daily sparkline and a change vs the previous window), plus prompt/response counts. Small payload - prefer this over the other ai_visibility_* tools unless you need a per-brand, per-source or per-day breakdown.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."},{"schema":{"type":"string"},"in":"query","name":"includePrevious","required":false,"description":"Include previous-period comparison values alongside each data point (roughly doubles the time-series payload). Defaults to false."}],"x-mcp":{"name":"ai_visibility_summary"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/overview":{"get":{"operationId":"getAiVisibilityOverview","summary":"AI visibility overview (leaderboard, trends, comparison)","tags":["AI Tracker"],"description":"Full AI-visibility overview: brand leaderboard, brand-visibility and share-of-voice trends, sentiment split, per-platform mention/citation rollups and a you-vs-average-competitor comparison. Large payload that grows with window length x tracked brands - keep the window to 30-90 days and leave topBrands at its default unless a wider leaderboard is genuinely needed. For headline numbers only, use ai_visibility_summary; for just the trend lines, use ai_visibility_trends.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."},{"schema":{"type":"string"},"in":"query","name":"includePrevious","required":false,"description":"Include previous-period comparison values alongside each data point (roughly doubles the time-series payload). Defaults to false."},{"schema":{"type":"string"},"in":"query","name":"topBrands","required":false,"description":"Max leaderboard rows, or 'all'. Defaults to 25. Rows are ordered by mentions descending; the response reports topBrandsTotal and topBrandsTruncated."},{"schema":{"type":"string"},"in":"query","name":"seriesLimit","required":false,"description":"Max brands to plot on the trend charts, or 'all'. Defaults to whatever topBrands is, which is what you want unless you need the full leaderboard alongside only a few chart lines."},{"schema":{"type":"string"},"in":"query","name":"includePresentation","required":false,"description":"Include chart colors and avatar initials (browser clients only)."}],"x-mcp":{"name":"ai_visibility_overview","strip":["includePresentation"]},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/charts":{"get":{"operationId":"getAiVisibilityCharts","summary":"AI visibility trend lines","tags":["AI Tracker"],"description":"Compact AI-visibility trends: visibility over time split by AI platform, sentiment split over time, and a radar comparing the tracked brand to the average competitor. Covers the same ground as ai_visibility_overview's charts but per-platform instead of per-brand, so it stays small. Prefer this for 'how has visibility moved' questions.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."}],"x-mcp":{"name":"ai_visibility_trends"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/brands":{"get":{"operationId":"getAiVisibilityBrands","summary":"Brand leaderboard across the filtered dataset","tags":["AI Tracker"],"description":"Every brand seen in AI answers for a team, ranked by mentions, with visibility and share of voice, plus a leader/challenger/emerging split. Use ai_visibility_brand for one brand's detail, or ai_visibility_competitors for the tracked competitor set only.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Max rows, or 'all'. Defaults to 25. Rows are ordered by mentions descending; the response reports total and truncated."}],"x-mcp":{"name":"ai_visibility_brands"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/brands/{name}":{"get":{"operationId":"getAiVisibilityBrandSummary","summary":"Single brand summary across the filtered dataset","tags":["AI Tracker"],"description":"Returns an AI visibility summary for one brand or competitor name using the supplied scope.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."},{"schema":{"type":"string"},"in":"query","name":"promptLimit","required":false,"description":"Max citing prompts to attach, 0 to omit them, or 'all'. Defaults to 5."},{"schema":{"type":"string"},"in":"query","name":"includeResponseText","required":false,"description":"Return each AI answer in full instead of a 500-character preview. Defaults to false."},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"x-mcp":{"name":"ai_visibility_brand"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/competitors":{"get":{"operationId":"getAiVisibilityCompetitors","summary":"Tracked competitor comparison","tags":["AI Tracker"],"description":"Per-competitor AI-visibility rollup: visibility, mentions, citations, share of voice, sentiment and change vs the previous window, ordered by share of voice. Defaults to the top 25 brands without their daily history - raise limit or set includeHistory=true only if you need more, both grow the payload fast. matrices=true adds the per-AI-model breakdown. For every brand seen in answers rather than the tracked set, use ai_visibility_brands.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."},{"schema":{"type":"string"},"in":"query","name":"includePrevious","required":false,"description":"Include previous-period comparison values alongside each data point (roughly doubles the time-series payload). Defaults to false."},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Max competitor rows, or 'all'. Defaults to 25. Also bounds the trend series and the matrix; the response reports total and truncated."},{"schema":{"type":"string"},"in":"query","name":"includeHistory","required":false,"description":"Include each row's daily visibility sparkline (~85% of a row). Defaults to false."},{"schema":{"type":"string"},"in":"query","name":"matrices","required":false,"description":"Include the per-competitor x per-AI-model matrix. Defaults to false."}],"x-mcp":{"name":"ai_visibility_competitors"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/citations":{"get":{"operationId":"getAiVisibilityCitations","summary":"Sources AI engines cite when answering about the brand","tags":["AI Tracker"],"description":"Which sources AI answers cite for a team: ranked domains with citation counts and domain ratings, domain-type and page-type splits, per-platform citation and mention counts, and top sources. Opt into the heavier blocks with subreddits=true (cited Reddit communities and threads), timeseries=true (per-day citations per domain) and competitorSources=true. To see the exact answers that cited one source, follow up with ai_visibility_citation_source.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."},{"schema":{"type":"string"},"in":"query","name":"includePrevious","required":false,"description":"Include previous-period comparison values alongside each data point (roughly doubles the time-series payload). Defaults to false."},{"schema":{"type":"string"},"in":"query","name":"domainLimit","required":false,"description":"Max cited-domain rows, 0 to omit them, or 'all'. Defaults to 50; rows are ordered by citations descending."},{"schema":{"type":"string"},"in":"query","name":"includeUrlStats","required":false,"description":"Include the per-URL breakdown on each domain row (~99% of a row). Defaults to false."},{"schema":{"type":"string"},"in":"query","name":"topSourcesLimit","required":false,"description":"Max entries in topSources, 0 to omit, or 'all'. Defaults to 25 - the full list is one entry per cited URL."},{"schema":{"type":"string"},"in":"query","name":"subreddits","required":false,"description":"Include cited subreddits and their threads. Defaults to false."},{"schema":{"type":"string"},"in":"query","name":"timeseries","required":false,"description":"Include per-day citations per domain. Defaults to false."},{"schema":{"type":"string"},"in":"query","name":"competitorSources","required":false,"description":"Include the per-competitor source breakdown. Defaults to false."}],"x-mcp":{"name":"ai_visibility_citations"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/citation-source":{"get":{"operationId":"getAiVisibilityCitationSource","summary":"AI answers that cited a source (provenance)","tags":["AI Tracker"],"description":"Returns the prompts, providers and responses that cited a given domain or URL, within the current filters. Pass url for one exact page, or domain for any page on a host.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."},{"schema":{"type":"string"},"in":"query","name":"url","required":false,"description":"Exact cited URL to trace"},{"schema":{"type":"string"},"in":"query","name":"domain","required":false,"description":"Host to trace (any cited URL on it)"}],"x-mcp":{"name":"ai_visibility_citation_source"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/platforms":{"get":{"operationId":"getAiVisibilityPlatforms","summary":"Per-AI-platform visibility rollup","tags":["AI Tracker"],"description":"How the brand performs on each AI platform (ChatGPT, Gemini, Perplexity, ...): mentions, visibility, average position, citations and sentiment. One row per platform, so this is a small payload. Answers 'which AI engine knows us best'.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."}],"x-mcp":{"name":"ai_visibility_platforms"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/sentiment":{"get":{"operationId":"getAiVisibilitySentiment","summary":"Sentiment evidence behind the brand's AI sentiment score","tags":["AI Tracker"],"description":"The quoted evidence behind the brand's AI sentiment: each classified mention with its label, confidence, source prompt, platform and the supporting quote. Use this to explain WHY sentiment moved; for the headline score alone use ai_visibility_summary.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Max evidence rows, or 'all'. Defaults to 50 - there is one row per classified mention, so the full set grows with tracked prompts x platforms."}],"x-mcp":{"name":"ai_visibility_sentiment"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/prompts":{"get":{"operationId":"getAiVisibilityPrompts","summary":"Tracked prompts with per-prompt visibility metrics","tags":["AI Tracker"],"description":"The team's tracked prompts, each with its own visibility, position, share of voice, sentiment, run status and next scheduled run. Paginated: pass page/pageSize and narrow with search or intent rather than pulling every row. Pass fields=minimal for just {id, prompt} when you only need to know what is tracked. Unlike the other ai_visibility_* tools this defaults to the full history, not the last 30 days.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"platform","required":false,"description":"Comma-separated AI platform names, or 'All Platforms' for no filter."},{"schema":{"type":"string"},"in":"query","name":"competitor","required":false,"description":"Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Comma-separated ISO2 country codes, or 'All Countries' for no filter."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Window length in days, ending today. Defaults to 30."},{"schema":{"type":"string"},"in":"query","name":"promptBrand","required":false,"description":"'branded', 'unbranded', or 'all'."},{"schema":{"type":"string"},"in":"query","name":"tracking","required":false,"description":"'tracked', 'untracked', or empty for both."},{"schema":{"type":"string"},"in":"query","name":"intent","required":false,"description":"Comma-separated prompt intents, or empty for all."},{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"'full' (default) for metrics per prompt, or 'minimal' for {id, prompt} only. Minimal ignores all scope filters and pagination."},{"schema":{"type":"integer"},"in":"query","name":"page","required":false,"description":"1-based page. Default 1."},{"schema":{"type":"string"},"in":"query","name":"pageSize","required":false,"description":"Rows per page, or 'all'. Defaults to 25. The response reports totalRows and totalPages."},{"schema":{"type":"string"},"in":"query","name":"sort","required":false,"description":"visibility | position | sov | sentiment | updatedAt. Omit for the dashboard default (pinned, then processing, then most recently updated)."},{"schema":{"type":"string"},"in":"query","name":"dir","required":false,"description":"asc | desc. Default desc."},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Case-insensitive substring match on prompt text."}],"x-mcp":{"name":"ai_visibility_prompts"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/ai-tracker/visibility/prompts/{id}":{"get":{"operationId":"getAiVisibilityPromptDetail","summary":"One tracked prompt in detail","tags":["AI Tracker"],"description":"Everything recorded for a single tracked prompt: each AI answer, the brands and competitors it named, their positions and sentiment, and the sources it cited. Get prompt ids from ai_visibility_prompts.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"YYYY-MM-DD"},{"schema":{"type":"string"},"in":"query","name":"fields","required":false,"description":"'full' (default) includes the raw responses[] array and nests each variant's answers under regionVariants[].responses. 'view' omits both and returns regionVariants[].responseCount instead - responseRows[] still carries each answer's text, metrics and cited sources, at roughly half the payload."},{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"x-mcp":{"name":"ai_visibility_prompt_detail"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/appsumo/link":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/article-embed-settings/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/article-embed-settings/rotate":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/billing/credit-pricing/":{"get":{"summary":"Credit top-up price ladder","tags":["Autumn"],"description":"The prepaid credit price on the caller's own plan: a flat rate per billing unit, or a tier ladder. Clients price a quantity from this with the shared helpers in @snowseo/utils.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"billingUnits":{"type":"number"},"minQuantity":{"type":"number"},"amount":{"type":"number"},"tierBehavior":{"type":"string"},"priced":{"type":"boolean"},"tiers":{"type":"array","items":{"type":"object","properties":{"to":{"type":"number","nullable":true},"amount":{"type":"number"},"flatAmount":{"type":"number"}}}}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/billing/feature-check/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/billing/lock-status/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/billing/plan-status/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/billing/previewAttach/":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"planId":{"type":"string"},"options":{"type":"array","items":{"type":"object","additionalProperties":true}}},"required":["planId"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v3/billing/previewUpdateSubscription/":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"planId":{"type":"string"},"cancelAction":{"type":"string"}},"required":["planId"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v3/billing/products/":{"get":{"summary":"List products","tags":["Autumn"],"description":"Products this caller's org can act on: credit packs, add-ons, and their own plan, plus their extra-credits discount.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"list":{"type":"array","items":{"type":"object","additionalProperties":true}},"discountPercent":{"type":"number","nullable":true}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/billing/updateSubscription/":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"planId":{"type":"string"},"cancelAction":{"type":"string"}},"required":["planId"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/v3/billing/usage-history/":{"get":{"operationId":"getUsageHistory","summary":"Get credit usage history","tags":["Billing"],"description":"Returns credit-consuming activity for the team's organization, newest first - what each charge was for, when, which brand, and how many credits. Filter with q, teams, categories (snowy | ai-visibility | content | seo-audit | knowledge-base | other) and creditMin/creditMax. Returns one page plus a nextCursor; pass it back as `cursor` to keep reading, and keep going before concluding a total. Use for questions like 'what did I spend credits on' or 'why did my balance drop'.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Active team (membership only)"},{"schema":{"type":"string","pattern":"^(all|[1-9][0-9]*)$"},"in":"query","name":"limit","required":false,"description":"Max number of entries (default 30, max 100), or \"all\" for the full filtered history in one response (CSV export)"},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false,"description":"Keyset pagination cursor from a prior response"},{"schema":{"type":"string"},"in":"query","name":"q","required":false,"description":"Free-text search over title/description"},{"schema":{"type":"string"},"in":"query","name":"teams","required":false,"description":"Comma-separated teamIds to narrow within the org"},{"schema":{"type":"string"},"in":"query","name":"categories","required":false,"description":"Comma-separated: snowy | ai-visibility | content"},{"schema":{"type":"number"},"in":"query","name":"creditMin","required":false,"description":"Min credits per row"},{"schema":{"type":"number"},"in":"query","name":"creditMax","required":false,"description":"Max credits per row"}],"x-mcp":{"name":"usage_history","strip":["limit"]},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/billing/usage-history/summary":{"get":{"operationId":"getUsageSummary","summary":"Get per-day credit usage buckets for the chart","tags":["Billing"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Range start (YYYY-MM-DD, UTC; end day inclusive)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"Range end (YYYY-MM-DD, UTC; inclusive)"},{"schema":{"type":"integer","minimum":1},"in":"query","name":"days","required":false,"description":"Fallback rolling window when start/end omitted"}],"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/changelogs/":{"get":{"operationId":"getChangelogs","summary":"Get changelog entries for a year or a single month","tags":["Changelogs"],"description":"Returns all visible changelog entries. If only year is provided, returns the full year. If month is also provided, returns that month only. Ordered by date descending.","parameters":[{"schema":{"type":"string","pattern":"^[0-9]{4}$"},"in":"query","name":"year","required":true,"description":"Year (e.g. 2026)"},{"schema":{"type":"string","pattern":"^(1[0-2]|[1-9])$"},"in":"query","name":"month","required":false,"description":"Optional. Month 1-12; if omitted, returns entire year."}],"responses":{"200":{"description":"Changelog entries for the month or full year, plus hasMore (true if older years have data).","content":{"application/json":{"schema":{"description":"Changelog entries for the month or full year, plus hasMore (true if older years have data).","type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"fullContent":{"type":"string"},"type":{"type":"string"},"date":{"type":"string"},"versionName":{"type":"string","nullable":true},"thumbnailUrl":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"visible":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}}},"hasMore":{"type":"boolean","description":"True if there are visible changelog entries before this year (for “Load older” button)."}},"required":["entries","hasMore"]}}}},"400":{"description":"Bad request (invalid year/month).","content":{"application/json":{"schema":{"description":"Bad request (invalid year/month).","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Database or server error while loading entries.","content":{"application/json":{"schema":{"description":"Database or server error while loading entries.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/changelogs/page":{"get":{"operationId":"getChangelogsPage","summary":"Get a day-aligned page of changelog entries","tags":["Changelogs"],"description":"Returns every visible entry for the next N distinct days (default 14), ordered by date descending. Pass the previous response's nextCursor as `cursor` to load the next page. Days are never split across pages.","parameters":[{"schema":{"type":"string"},"in":"query","name":"cursor","required":false,"description":"ISO date — return entries strictly older than this (previous nextCursor)."},{"schema":{"type":"string","pattern":"^[0-9]{1,2}$"},"in":"query","name":"days","required":false,"description":"Distinct days per page (default 14, capped at 60)."}],"responses":{"200":{"description":"A page of N days of changelog entries plus the next cursor.","content":{"application/json":{"schema":{"description":"A page of N days of changelog entries plus the next cursor.","type":"object","properties":{"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"fullContent":{"type":"string"},"type":{"type":"string"},"date":{"type":"string"},"versionName":{"type":"string","nullable":true},"thumbnailUrl":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"visible":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}}}},"nextCursor":{"type":"string","nullable":true},"hasMore":{"type":"boolean"}},"required":["entries","nextCursor","hasMore"]}}}},"500":{"description":"Database or server error while loading entries.","content":{"application/json":{"schema":{"description":"Database or server error while loading entries.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/changelogs/months":{"get":{"operationId":"getChangelogMonths","summary":"Get the complete list of months that have changelog entries","tags":["Changelogs"],"description":"Returns every (year, month) with at least one visible changelog entry, newest first — for building the sidebar independently of loaded entries.","responses":{"200":{"description":"All months with visible entries, newest first.","content":{"application/json":{"schema":{"description":"All months with visible entries, newest first.","type":"object","properties":{"months":{"type":"array","items":{"type":"object","properties":{"year":{"type":"number"},"month":{"type":"number"}},"required":["year","month"]}}},"required":["months"]}}}},"500":{"description":"Database or server error while loading months.","content":{"application/json":{"schema":{"description":"Database or server error while loading months.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/changelogs/{slug}":{"get":{"operationId":"getChangelogBySlug","summary":"Get a single changelog entry by slug","tags":["Changelogs"],"description":"Returns a single visible changelog entry (daily or monthly_summary) by slug.","parameters":[{"schema":{"type":"string","minLength":1},"in":"path","name":"slug","required":true,"description":"Changelog slug (e.g. monthly-update-2026-02)."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"fullContent":{"type":"string"},"type":{"type":"string"},"date":{"type":"string"},"versionName":{"type":"string","nullable":true},"thumbnailUrl":{"type":"string","nullable":true},"slug":{"type":"string","nullable":true},"visible":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","fullContent","type","date","versionName","thumbnailUrl","slug","visible","createdAt","updatedAt"]}}}},"400":{"description":"Bad request (empty or invalid slug).","content":{"application/json":{"schema":{"description":"Bad request (empty or invalid slug).","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"No visible changelog with this slug.","content":{"application/json":{"schema":{"description":"No visible changelog with this slug.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Database or server error while loading the entry.","content":{"application/json":{"schema":{"description":"Database or server error while loading the entry.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/changelogs/announcements/":{"get":{"operationId":"getDashboardAnnouncements","summary":"Get days of changelog entries promoted to the dashboard","tags":["Changelogs"],"description":"Returns one page of days, newest first. Releases publish as a batch sharing a timestamp, so a day is the unit: each carries its updates' ids and titles plus an unread count. Bodies are not included - fetch a day to read them.","parameters":[{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"cursor","required":false,"description":"YYYY-MM-DD from the previous page's nextCursor; returns older days."},{"schema":{"type":"string","pattern":"^[0-9]{1,2}$"},"in":"query","name":"limit","required":false,"description":"Days per page (default 20, capped at 50)."},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"unread","required":false,"description":"Restrict the page to days holding something unread."}],"responses":{"200":{"description":"A page of days, the total unread update count, and the cursor for the next page.","content":{"application/json":{"schema":{"description":"A page of days, the total unread update count, and the cursor for the next page.","type":"object","properties":{"days":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"entries":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"]}},"unread":{"type":"number"},"preview":{"type":"string"},"imageUrl":{"type":"string","nullable":true}},"required":["date","entries","unread","preview","imageUrl"]}},"unreadCount":{"type":"number"},"totalDays":{"type":"number"},"nextCursor":{"type":"string","nullable":true}},"required":["days","unreadCount","totalDays","nextCursor"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"description":"Not signed in.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Server error while loading.","content":{"application/json":{"schema":{"description":"Server error while loading.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/changelogs/announcements/day":{"get":{"operationId":"getDashboardAnnouncementDay","summary":"Get every announcement published on one day, bodies included","tags":["Changelogs"],"description":"Returns every update published on the given calendar day, so they can be read together.","parameters":[{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"in":"query","name":"date","required":true,"description":"YYYY-MM-DD, as returned on a day in the list."}],"responses":{"200":{"description":"Every announcement on that date, titles split from bodies.","content":{"application/json":{"schema":{"description":"Every announcement on that date, titles split from bodies.","type":"object","properties":{"date":{"type":"string"},"announcements":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"imageUrl":{"type":"string","nullable":true},"type":{"type":"string"},"date":{"type":"string"},"slug":{"type":"string","nullable":true}},"required":["id","title","description","imageUrl","type","date","slug"]}}},"required":["date","announcements"]}}}},"400":{"description":"Invalid date.","content":{"application/json":{"schema":{"description":"Invalid date.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"description":"Not signed in.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"No published announcements on this date.","content":{"application/json":{"schema":{"description":"No published announcements on this date.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Server error while loading.","content":{"application/json":{"schema":{"description":"Server error while loading.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/changelogs/announcements/read":{"post":{"operationId":"markDashboardAnnouncementsRead","summary":"Dismiss dashboard announcements","tags":["Changelogs"],"description":"Marks the given announcements as read for the signed-in user. Send `all: true` instead of `ids` to dismiss every unread one.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string"}},"all":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Number of announcements marked read.","content":{"application/json":{"schema":{"description":"Number of announcements marked read.","type":"object","properties":{"success":{"type":"boolean"},"count":{"type":"number"}},"required":["success","count"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"description":"Not signed in.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Server error while saving.","content":{"application/json":{"schema":{"description":"Server error while saving.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/cms/articles":{"get":{"summary":"List articles","tags":["CMS"],"description":"Returns a paginated list of articles for the team with status, SEO scores, publish dates, and metadata. Does not include full article body content.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"page","required":false,"description":"Page number (default: 1)"},{"schema":{"type":"string"},"in":"query","name":"per_page","required":false,"description":"Items per page (default: 20, or \"all\")"},{"schema":{"type":"string","enum":["draft","processing","generated","scheduled","published","failed","manual","all"]},"in":"query","name":"status","required":false,"description":"Filter by status (draft, processing, generated, scheduled, published, failed, manual) or \"all\""},{"schema":{"type":"string"},"in":"query","name":"topicId","required":false,"description":"Filter to articles belonging to a topic cluster"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"ISO date — only articles whose scheduledAt or publishedAt is on/after this (calendar-window scoping)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"ISO date — only articles whose scheduledAt or publishedAt is on/before this (calendar-window scoping)"},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Case-insensitive search across title, slug, keywords, prompts, providers, and topic name"},{"schema":{"type":"string","enum":["name","status","seo","topic","created"],"default":"created"},"in":"query","name":"sortBy","required":false,"description":"Sort column"},{"schema":{"type":"string","enum":["asc","desc"],"default":"desc"},"in":"query","name":"sortDir","required":false,"description":"Sort direction"},{"schema":{"type":"string"},"in":"query","name":"category","required":false,"description":"Filter to articles carrying this category name"},{"schema":{"type":"string"},"in":"query","name":"tag","required":false,"description":"Filter to articles carrying this tag name"}],"x-mcp":{"name":"cms_articles"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"articles":{"type":"array","items":{"type":"object","properties":{"slug":{"type":"string"},"topicId":{"type":"string","nullable":true},"title":{"type":"string","nullable":true},"status":{"type":"string","nullable":true,"enum":["draft","processing","generated","scheduled","published","failed","manual"]},"type":{"type":"string","nullable":true,"enum":["listicle","comparison","news","review","guide","manual"]},"keywords":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string"},"type":{"type":"string","enum":["primary","secondary"]}}}},"prompts":{"type":"array","items":{"type":"object","properties":{"prompt":{"type":"string"},"type":{"type":"string","enum":["primary","secondary"]},"topic":{"type":"string"}}}},"auditScore":{"type":"number","nullable":true},"url":{"type":"string","nullable":true},"cmsArticleId":{"type":"string","nullable":true},"provider":{"type":"array","nullable":true,"items":{"type":"string","enum":["wordpress","shopify","webflow","ghost","webhook","framer","grigora","embed"]}},"publishedAt":{"type":"string","nullable":true},"scheduledAt":{"type":"string","nullable":true},"lastRefreshedAt":{"type":"string","nullable":true},"cmsPostStatus":{"type":"string","nullable":true,"enum":["draft","published"]},"createdAt":{"type":"string","nullable":true},"updatedAt":{"type":"string","nullable":true},"metaData":{"type":"object","nullable":true,"additionalProperties":true},"isPublic":{"type":"boolean","nullable":true},"isPillar":{"type":"boolean","nullable":true},"generating":{"type":"boolean"},"generationKind":{"type":"string","nullable":true},"finalizing":{"type":"boolean"},"categories":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}}}}},"pagination":{"type":"object","properties":{"page":{"type":"number"},"perPage":{"type":"number"},"total":{"type":"number"},"totalPages":{"type":"number"},"hasMore":{"type":"boolean"}}}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"post":{"operationId":"createArticle","summary":"Create an article (draft) from a pre-built outline","tags":["CMS"],"description":"Create a draft article from an outline you ALREADY have. This does NOT generate the body content, and it cannot invent the outline for you: `articleOutline` is required and its `generateOutlineResponse` must be the whole object returned by `generate_outline`. For a fully AI-written article, prefer `generate_article`, which produces the outline and the content in one call. Use this only for the step-by-step wizard, where the user reviews the outline first; then call `start_article_generation` with the returned `slug` to write the content.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","topicId","articleOutline"],"properties":{"teamId":{"type":"string","description":"Team id (falls back to the session's active project)."},"title":{"type":"string","description":"Article title."},"content":{"type":"string","description":"Optional markdown body. Leave empty for a draft you will fill via start_article_generation."},"type":{"type":"string","enum":["listicle","comparison","news","review","guide"],"default":"listicle","description":"Article type. Defaults to listicle. Must match the outline's structure."},"status":{"type":"string","enum":["draft","processing","generated","scheduled","published","failed","manual"],"default":"draft"},"contentArticleType":{"type":"string","nullable":true,"description":"\"pillar\" or \"cluster\" for pillar/cluster content, null/omitted for generic posts."},"authorName":{"type":"string"},"topicId":{"type":"string","description":"Required. Id of the team's topic cluster this article belongs to — get it from `topic_clusters_list`, or create one with `create_topic_cluster`. The topic name is taken from this cluster (do not pass a free-text topic)."},"keywords":{"type":"array","description":"STRONGLY RECOMMENDED: the keywords from `generate_keywords`. Optional only because a user can legitimately deselect them all in the UI wizard - an agent should always pass them, since they are what the generated body targets.","items":{"type":"object","properties":{"keyword":{"type":"string"},"type":{"type":"string","enum":["primary","secondary"]}},"required":["keyword","type"]}},"prompts":{"type":"array","description":"STRONGLY RECOMMENDED: the prompts from `generate_prompts`. Optional for the same reason as `keywords`; pass them so the article answers the questions it is meant to rank for.","items":{"type":"object","properties":{"prompt":{"type":"string"},"type":{"type":"string","enum":["primary","secondary"]}},"required":["prompt","type"]}},"metaData":{"type":"object","properties":{"metaDescription":{"type":"string"},"metaTitle":{"type":"string"},"ogTitle":{"type":"string"},"ogDescription":{"type":"string"},"twitterTitle":{"type":"string"},"twitterDescription":{"type":"string"},"canonicalUrl":{"type":"string"}}},"articleOutline":{"type":"object","additionalProperties":true,"description":"Outline wrapper consumed by the generator. Shape: { generateOutlineResponse: <the FULL object returned by generate_outline>, outlineAdditionalElements: { targetWordCount:number, _shouldIncludeFAQ:boolean, _shouldIncludeTldr:boolean, _shouldIncludeConclusion:boolean, _shouldIncludeCTA:boolean }, outlineNonEditable: { introduction: { estimated_words:150 }, conclusion?: { estimated_words:150 } }, audience_level:'auto', content_tone?:string }. Do NOT hand-author the outline — obtain it from generate_outline and pass it through unchanged."},"internalLinkTargetSlugs":{"type":"array","items":{"type":"string"},"description":"Slugs of existing SnowSEO articles to link out to (internal links)."},"internalLinkTargetUrls":{"type":"array","items":{"type":"string"},"description":"Absolute http(s) URLs to link out to that are not SnowSEO articles."},"language":{"type":"string","description":"Language code to write this article in (e.g. 'es'). Usually two letters; Chinese is 'zh_CN'/'zh_TW' and Hebrew is 'iw'. Defaults to the brand's Writing Language, then its brand language. Only pass this when the user asks for a specific language for this one article."}}}}}},"x-mcp":{"name":"create_article"},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"article":{"type":"object","properties":{"slug":{"type":"string"},"teamId":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/articles/{slug}":{"get":{"operationId":"getArticle","summary":"Get article by slug","tags":["CMS"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"skipCmsSync","required":false},{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"x-mcp":{"name":"get_article"},"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"patch":{"operationId":"updateArticle","summary":"Update an article","tags":["CMS"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"content":{"type":"string"},"metaData":{"type":"object"},"slug":{"type":"string"},"status":{"type":"string"},"isPublic":{"type":"boolean"},"jsonLd":{"type":"string","nullable":true},"keywords":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string"},"type":{"type":"string","enum":["primary","secondary"]}},"required":["keyword","type"]}},"prompts":{"type":"array","items":{"type":"object","properties":{"prompt":{"type":"string"},"type":{"type":"string","enum":["primary","secondary"]}},"required":["prompt","type"]}},"revisionSource":{"type":"string","enum":["manual"]},"revisionLabel":{"type":"string"},"autoOptimizeState":{"type":"object","properties":{"appliedIds":{"type":"array","items":{"type":"string"}},"dismissedIds":{"type":"array","items":{"type":"string"}},"undoData":{"type":"object","additionalProperties":true}}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"x-mcp":{"name":"update_article"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"article":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"isPublic":{"type":"boolean"},"updatedAt":{"type":"string"},"lastRefreshedAt":{"type":"string","nullable":true},"cmsSyncDirty":{"type":"boolean"},"publishedSnapshot":{"type":"object","nullable":true,"additionalProperties":true}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"generationKind":{"type":"string","nullable":true},"generationPhase":{"type":"string","nullable":true},"lockedFields":{"type":"array","items":{"type":"string"}}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"delete":{"operationId":"deleteArticle","summary":"Delete an article","tags":["CMS"],"description":"Delete an existing SnowSEO article by slug. This removes the SnowSEO article row; it does not unpublish external CMS copies.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"x-mcp":{"name":"delete_article"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/articles/{slug}/reset-changes":{"post":{"operationId":"resetArticleChanges","summary":"Reset changes to the content snapshot","tags":["CMS"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/articles/{slug}/public-feed":{"patch":{"operationId":"setArticlePublicFeedVisibility","summary":"Set article public feed visibility","tags":["CMS"],"description":"Show or hide an existing SnowSEO article on public/feed surfaces by updating its public visibility flag.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["isPublic"],"properties":{"teamId":{"type":"string"},"isPublic":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"x-mcp":{"name":"set_article_public_feed"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"article":{"type":"object","properties":{"slug":{"type":"string"},"isPublic":{"type":"boolean"},"updatedAt":{"type":"string"}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/articles/{slug}/internal-links":{"get":{"operationId":"getArticleInternalLinks","summary":"Get outbound internal links for an article","tags":["CMS"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"x-mcp":{"name":"article_internal_links"},"responses":{"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/team/internal-links":{"get":{"operationId":"getTeamInternalLinks","summary":"Get all internal links for a team","tags":["CMS"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false}],"x-mcp":{"name":"team_internal_links"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"internalLinks":{"type":"array","items":{"type":"object","properties":{"sourceSlug":{"type":"string"},"targetSlug":{"type":"string","nullable":true},"targetUrl":{"type":"string","nullable":true},"status":{"type":"string"}}}}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/schedule":{"post":{"operationId":"scheduleArticle","summary":"Schedule an article for publishing","tags":["CMS"],"description":"Schedule an existing SnowSEO article to publish to a connected CMS provider at a future date-time.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["articleSlug","provider","scheduledAt"],"properties":{"teamId":{"type":"string"},"articleSlug":{"type":"string"},"provider":{"type":"string","enum":["wordpress","shopify","webflow","ghost","webhook","framer","grigora","embed"]},"scheduledAt":{"type":"string","format":"date-time"},"cmsPostStatus":{"type":"string","enum":["draft","publish"]}}}}}},"x-mcp":{"name":"schedule_article"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"message":{"type":"string"},"jobId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/cms/schedule/unschedule":{"delete":{"operationId":"unscheduleArticles","summary":"Unschedule one or many articles","tags":["CMS"],"description":"Remove a pending scheduled publish job from one or more existing SnowSEO articles.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","allOf":[{"oneOf":[{"required":["articleSlug"]},{"required":["items"]}]}],"properties":{"teamId":{"type":"string"},"articleSlug":{"type":"string"},"items":{"type":"array","minItems":1,"items":{"type":"object","required":["articleSlug"],"properties":{"articleSlug":{"type":"string"}}}}}}}}},"x-mcp":{"name":"unschedule_article"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"succeeded":{"type":"number"},"failed":{"type":"number"},"results":{"type":"array","items":{"type":"object","properties":{"articleSlug":{"type":"string"},"success":{"type":"boolean"},"message":{"type":"string"},"error":{"type":"string"}},"additionalProperties":true}},"message":{"type":"string"},"error":{"type":"string"}},"additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/publish":{"post":{"operationId":"publishArticles","summary":"Publish one or many articles to a CMS provider","tags":["CMS"],"description":"Publish existing SnowSEO articles to connected CMS providers. This does not create or generate new article content.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","allOf":[{"oneOf":[{"required":["articleSlug","provider"]},{"required":["items"]}]}],"properties":{"teamId":{"type":"string"},"articleSlug":{"type":"string"},"provider":{"type":"string","enum":["wordpress","shopify","webflow","ghost","webhook","framer","grigora","embed"]},"status":{"type":"string","enum":["draft","publish"]},"items":{"type":"array","minItems":1,"items":{"type":"object","required":["articleSlug","provider"],"properties":{"articleSlug":{"type":"string"},"provider":{"type":"string","enum":["wordpress","shopify","webflow","ghost","webhook","framer","grigora","embed"]},"status":{"type":"string","enum":["draft","publish"]}}}}}}}}},"x-mcp":{"name":"publish_article"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"succeeded":{"type":"number"},"failed":{"type":"number"},"results":{"type":"array","items":{"type":"object","properties":{"articleSlug":{"type":"string"},"provider":{"type":"string"},"success":{"type":"boolean"},"status":{"type":"string"},"postId":{"type":"string"},"postUrl":{"type":"string"},"error":{"type":"string"}},"additionalProperties":true}},"articleSlug":{"type":"string","description":"Article slug, echoed from the request."},"postId":{"type":"string","description":"CMS item ID (all providers)"},"postUrl":{"type":"string","description":"Published or draft URL (all providers)"},"status":{"type":"string","description":"draft | publish or CMS status"}},"additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"generationKind":{"type":"string","nullable":true},"generationPhase":{"type":"string","nullable":true},"lockedFields":{"type":"array","items":{"type":"string"}}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/unpublish":{"post":{"operationId":"unpublishArticles","summary":"Unpublish one or many articles from a CMS provider","tags":["CMS"],"description":"Unpublish existing SnowSEO articles from connected CMS providers while keeping the SnowSEO article rows.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","allOf":[{"oneOf":[{"required":["articleSlug","provider"]},{"required":["items"]}]}],"properties":{"teamId":{"type":"string"},"articleSlug":{"type":"string"},"provider":{"type":"string","enum":["wordpress","shopify","webflow","ghost","webhook","framer","grigora","embed"]},"items":{"type":"array","minItems":1,"items":{"type":"object","required":["articleSlug","provider"],"properties":{"articleSlug":{"type":"string"},"provider":{"type":"string","enum":["wordpress","shopify","webflow","ghost","webhook","framer","grigora","embed"]}}}}}}}}},"x-mcp":{"name":"unpublish_article"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"succeeded":{"type":"number"},"failed":{"type":"number"},"results":{"type":"array","items":{"type":"object","properties":{"articleSlug":{"type":"string"},"provider":{"type":"string"},"success":{"type":"boolean"},"remainingProviders":{"type":"array","items":{"type":"string"}},"error":{"type":"string"}},"additionalProperties":true}},"remainingProviders":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"generationKind":{"type":"string","nullable":true},"generationPhase":{"type":"string","nullable":true},"lockedFields":{"type":"array","items":{"type":"string"}}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/articles/{slug}/categories":{"put":{"summary":"Set article categories (full replace)","tags":["CMS"],"description":"Replaces the article's categories with the given set of category names (idempotent, free-form).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["categories"],"properties":{"teamId":{"type":"string"},"categories":{"type":"array","items":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"count":{"type":"number"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/articles/{slug}/tags":{"put":{"summary":"Set article tags (full replace)","tags":["CMS"],"description":"Replaces the article's tags with the given set of tag names (idempotent, free-form).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tags"],"properties":{"teamId":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"count":{"type":"number"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/articles/{slug}/auto-optimize":{"post":{"summary":"Auto-optimize an article","tags":["CMS"],"description":"Returns an AI-optimized version of the article content based on selected audit issues, keywords, and prompts. Charges a flat credit cost derived from the article's word count.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"keywords":{"type":"array","items":{"type":"string"}},"prompts":{"type":"array","items":{"type":"string"}},"selectedIssues":{"type":"array","items":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Success: `{ queued: true, jobId, creditEstimate }` — the job is enqueued; poll `GET /articles/:slug/auto-optimize/status` until `status` is `done` or `failed`. Insufficient credits: `{ queued: false, requiredCredits, message }`.","content":{"application/json":{"schema":{"type":"object","description":"Success: `{ queued: true, jobId, creditEstimate }` — the job is enqueued; poll `GET /articles/:slug/auto-optimize/status` until `status` is `done` or `failed`. Insufficient credits: `{ queued: false, requiredCredits, message }`.","properties":{"queued":{"type":"boolean"},"jobId":{"type":"string"},"creditEstimate":{"type":"number"},"requiredCredits":{"type":"number"},"message":{"type":"string"},"alreadyRunning":{"type":"boolean"}},"additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"402":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/articles/import":{"post":{"summary":"Import an article from a URL, raw HTML, or Markdown","tags":["CMS"],"description":"Creates an article draft by scraping a URL or parsing HTML/Markdown.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"html":{"type":"string"},"markdown":{"type":"string"},"teamId":{"type":"string"},"topicId":{"type":"string"}}}}}},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"article":{"type":"object","properties":{"slug":{"type":"string"},"teamId":{"type":"string"},"title":{"type":"string"},"status":{"type":"string"},"type":{"type":"string"}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/audit/articles/{slug}":{"get":{"operationId":"getArticleAudit","summary":"Get latest article audit","tags":["CMS"],"description":"Returns the latest cached audit for an article.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"x-mcp":{"name":"article_audit"},"responses":{"200":{"description":"Default Response"}}}},"/v3/cms/audit/articles/{slug}/history":{"get":{"operationId":"getArticleAuditHistory","summary":"Get article audit history","tags":["CMS"],"description":"Returns paginated cached audit history for an article.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"limit","required":false},{"schema":{"type":"string"},"in":"query","name":"offset","required":false},{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"x-mcp":{"name":"article_audit_history"},"responses":{"200":{"description":"Default Response"}}}},"/v3/cms/editor/copilot":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/cms/taxonomy/":{"get":{"summary":"List the team's reusable categories + tags","tags":["CMS"],"description":"Single source of taxonomy suggestions: the categories/tags already in use across the team's articles UNION the live taxonomy of every connected CMS provider (WordPress, Ghost, Shopify), merged and deduped. Connecting a CMS imports its taxonomy automatically; `syncPending` is true while that import is still running.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"x-mcp":{"name":"list_taxonomy"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"categories":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}},"syncedProviders":{"type":"array","items":{"type":"string"}},"syncPending":{"type":"boolean"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/taxonomy/refresh":{"post":{"summary":"Refresh taxonomy from connected CMS providers","tags":["CMS"],"description":"Pulls the live categories/tags from the team's connected providers (WordPress, Ghost, Shopify, Webflow, Grigora) into the reusable vocabulary and returns it. Purely additive - terms created in SnowSEO are never removed. Re-importing each WordPress-published article's own assigned terms continues on the queue afterwards (`syncPending`). Single-flighted per team.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"}}}}}},"x-mcp":{"name":"refresh_taxonomy"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"syncedProviders":{"type":"array","items":{"type":"string"}},"categories":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}},"syncPending":{"type":"boolean"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/cms/taxonomy/term":{"post":{"summary":"Create a team category or tag","tags":["CMS"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","name"],"properties":{"teamId":{"type":"string"},"kind":{"type":"string","enum":["category","tag"]},"name":{"type":"string"}}}}}},"x-mcp":{"name":"create_taxonomy_term"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"categories":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"patch":{"summary":"Rename a team category or tag (merges on name collision)","tags":["CMS"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","oldName","name"],"properties":{"teamId":{"type":"string"},"kind":{"type":"string","enum":["category","tag"]},"oldName":{"type":"string"},"name":{"type":"string"}}}}}},"x-mcp":{"name":"rename_taxonomy_term"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"categories":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"delete":{"summary":"Delete a team category or tag (removes it from all articles)","tags":["CMS"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string","enum":["category","tag"]},"in":"query","name":"kind","required":true},{"schema":{"type":"string"},"in":"query","name":"name","required":true}],"x-mcp":{"name":"delete_taxonomy_term"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"categories":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/contact/":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/custom-domains/":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}},"delete":{"responses":{"200":{"description":"Default Response"}}}},"/v3/custom-domains/verify":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/custom-domains/path-prefix":{"patch":{"responses":{"200":{"description":"Default Response"}}}},"/v3/custom-domains/settings":{"patch":{"responses":{"200":{"description":"Default Response"}}}},"/v3/custom-domains/resolve":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/custom-domains/authorize":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/feed/{brandSlug}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandSlug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/feed/{brandSlug}/rss.xml":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandSlug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/feed/{brandSlug}/{articleSlug}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"brandSlug","required":true},{"schema":{"type":"string"},"in":"path","name":"articleSlug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/ai-detector/":{"post":{"summary":"AI Detector","tags":["Free Tools"],"description":"Detect AI content in provided text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","minLength":50,"maxLength":25000}},"required":["text"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"aiScore":{"type":"number"},"humanScore":{"type":"number"},"mixedScore":{"type":"number"},"wordCount":{"type":"number"},"truncated":{"type":"boolean"},"verdict":{"type":"string"},"detectorScores":{"type":"object","additionalProperties":true},"raw":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/ai-detector/usage":{"get":{"summary":"AI Detector usage","tags":["Free Tools"],"description":"Return yearly usage for AI Detector free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/ai-readiness/":{"post":{"summary":"AI Readiness Analyzer","tags":["Free Tools"],"description":"Analyze a URL's structure and signals for AI readiness.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"totalScore":{"type":"number"},"grade":{"type":"string"},"checks":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string"},"status":{"type":"string"},"score":{"type":"number"},"details":{"type":"string"},"recommendation":{"type":"string"}}}},"analyzedAt":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/ai-readiness/usage":{"get":{"summary":"AI Readiness usage","tags":["Free Tools"],"description":"Return yearly usage for AI Readiness free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/article-summarizer/":{"post":{"summary":"Article Summarizer","tags":["Free Tools"],"description":"Summarize articles from URL or text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","description":"URL or text to summarize"},"mode":{"type":"string","enum":["website","text"],"description":"Mode of input"}},"required":["input","mode"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"summary":{"type":"string"},"wordCount":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/article-summarizer/usage":{"get":{"summary":"Article Summarizer usage","tags":["Free Tools"],"description":"Return yearly usage for Article Summarizer free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/backlink-checker/":{"post":{"summary":"Backlink Checker","tags":["Free Tools"],"description":"Check backlinks for a given domain","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/backlink-checker/usage":{"get":{"summary":"Backlink Checker usage","tags":["Free Tools"],"description":"Return usage for Backlink Checker free tool","responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/blog-outline-generator/":{"post":{"summary":"Blog Outline Generator","tags":["Free Tools"],"description":"Generate SEO-optimized blog outlines based on website or text topic.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","description":"Text content or website URL to analyze"},"mode":{"type":"string","enum":["text","website","image"]}},"required":["input","mode"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"outlines":{"type":"array","items":{"type":"object","properties":{"outline":{"type":"string"},"wordCount":{"type":"number"}}}}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"description":"Bad Request","type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Too Many Requests","content":{"application/json":{"schema":{"description":"Too Many Requests","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"description":"Internal Server Error","type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/blog-outline-generator/usage":{"get":{"summary":"Blog Outline Generator usage","tags":["Free Tools"],"description":"Return yearly usage for Blog Outline Generator free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/blog-post-ideas/":{"post":{"summary":"Blog Post Ideas Generator","tags":["Free Tools"],"description":"Generate SEO-optimized blog post ideas based on a topic.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","description":"Topic for blog ideas"},"mode":{"type":"string","enum":["text"]},"niche":{"type":"string","description":"Optional niche"}},"required":["input"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"ideas":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"type":{"type":"string"},"targetKeyword":{"type":"string"},"description":{"type":"string"},"estimatedWordCount":{"type":"string"}}}},"rawResponse":{"type":"string"}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"description":"Bad Request","type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Too Many Requests","content":{"application/json":{"schema":{"description":"Too Many Requests","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"description":"Internal Server Error","type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/blog-post-ideas/usage":{"get":{"summary":"Blog Post Ideas usage","tags":["Free Tools"],"description":"Return yearly usage for Blog Post Ideas free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/content-idea-generator/":{"post":{"summary":"Content Idea Generator","tags":["Free Tools"],"description":"Generate creative content ideas across multiple formats.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string","minLength":3,"description":"Topic to generate ideas for"},"contentType":{"type":"string","description":"Optional specific content type focus"}},"required":["topic"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"ideas":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"format":{"type":"string"},"platform":{"type":"string"},"hook":{"type":"string"},"targetAudience":{"type":"string"},"engagementPotential":{"type":"string"}}}},"rawResponse":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/content-idea-generator/usage":{"get":{"summary":"Content Idea Generator usage","tags":["Free Tools"],"description":"Return yearly usage for Content Idea Generator free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/copywriting-generator/generate":{"post":{"summary":"Copywriting Generator","tags":["Free Tools (Copywriting)"],"description":"Generate improved copy based on text or a URL.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["url","text"]},"url":{"type":"string"},"text":{"type":"string"}},"required":["mode"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"originalHtml":{"type":"string"},"originalText":{"type":"string"},"generatedHtml":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/copywriting-generator/reroll":{"post":{"summary":"Copywriting - Reroll Sentence","tags":["Free Tools (Copywriting)"],"description":"Generate an alternative version of a specific sentence.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"originalSentence":{"type":"string"},"currentSentence":{"type":"string"},"context":{"type":"string"}},"required":["originalSentence","currentSentence"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"newSentence":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/copywriting-generator/scrape":{"post":{"summary":"Copywriting - Scrape Website","tags":["Free Tools (Copywriting)"],"description":"Scrape a URL to prepare it for copywriting generation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"html":{"type":"string"},"text":{"type":"string"},"css":{"type":"string"},"stylesheetLinks":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/copywriting-generator/usage":{"get":{"summary":"Copywriting Generator usage","tags":["Free Tools"],"description":"Return yearly usage for Copywriting Generator free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/domain-rating/":{"post":{"summary":"Domain Rating Checker","tags":["Free Tools"],"description":"Check Domain Rating for a given domain","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/domain-rating/usage":{"get":{"summary":"Domain Rating Checker usage","tags":["Free Tools"],"description":"Return usage for Domain Rating Checker free tool","responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/geo-analysis/":{"post":{"summary":"GEO Analysis","tags":["Free Tools"],"description":"Analyze a webpage for E-E-A-T signals (Experience, Expertise, Authoritativeness, Trustworthiness).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"The webpage URL to audit"}},"required":["url"]}}}},"responses":{"200":{"description":"Successful GEO audit","content":{"application/json":{"schema":{"description":"Successful GEO audit","type":"object","properties":{"url":{"type":"string","description":"Analyzed page URL"},"overallScore":{"type":"number","description":"Overall E-E-A-T score 0–100"},"pageType":{"type":"string","description":"Detected page type (e.g. Product Landing Page)"},"analyzedAt":{"type":"string","description":"ISO timestamp of the audit"},"categories":{"type":"object","description":"Scores and breakdown per E-E-A-T category","properties":{"expertise":{"type":"object","properties":{"score":{"type":"number"},"label":{"type":"string"},"description":{"type":"string"},"working":{"type":"array","items":{"type":"string"}},"missing":{"type":"array","items":{"type":"string"}},"improvements":{"type":"array","items":{"type":"string"}},"checks":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string"},"passed":{"type":"boolean"},"answer":{"type":"string"}}}}}},"experience":{"type":"object","properties":{"score":{"type":"number"},"label":{"type":"string"},"description":{"type":"string"},"working":{"type":"array","items":{"type":"string"}},"missing":{"type":"array","items":{"type":"string"}},"improvements":{"type":"array","items":{"type":"string"}},"checks":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string"},"passed":{"type":"boolean"},"answer":{"type":"string"}}}}}},"authoritativeness":{"type":"object","properties":{"score":{"type":"number"},"label":{"type":"string"},"description":{"type":"string"},"working":{"type":"array","items":{"type":"string"}},"missing":{"type":"array","items":{"type":"string"}},"improvements":{"type":"array","items":{"type":"string"}},"checks":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string"},"passed":{"type":"boolean"},"answer":{"type":"string"}}}}}},"trustworthiness":{"type":"object","properties":{"score":{"type":"number"},"label":{"type":"string"},"description":{"type":"string"},"working":{"type":"array","items":{"type":"string"}},"missing":{"type":"array","items":{"type":"string"}},"improvements":{"type":"array","items":{"type":"string"}},"checks":{"type":"array","items":{"type":"object","properties":{"question":{"type":"string"},"passed":{"type":"boolean"},"answer":{"type":"string"}}}}}}}},"technicalAudits":{"type":"array","description":"Technical SEO signals (present/missing/partial)","items":{"type":"object","properties":{"name":{"type":"string"},"status":{"type":"string","enum":["present","missing","partial"]},"url":{"type":"string","nullable":true},"details":{"type":"string","nullable":true}}}},"detailedQuestions":{"type":"array","description":"Per-category Q&A checks","items":{"type":"object","properties":{"id":{"type":"string"},"category":{"type":"string","enum":["experience","expertise","authoritativeness","trustworthiness"]},"question":{"type":"string"},"passed":{"type":"boolean"},"answer":{"type":"string"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/geo-analysis/usage":{"get":{"summary":"GEO Analysis usage","tags":["Free Tools"],"description":"Return yearly usage for GEO analysis free tool, with guest→signed carry-over.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/image-alt-tag-generator/":{"post":{"summary":"Image Alt Tag Generator","tags":["Free Tools"],"description":"Generate SEO-optimized image alt tags based on image or text description.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","description":"Image URL, base64 data URL, or text description"},"mode":{"type":"string","enum":["text","image"]}},"required":["input","mode"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"altTags":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"characterCount":{"type":"number"}}}}}}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"description":"Bad Request","type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Too Many Requests","content":{"application/json":{"schema":{"description":"Too Many Requests","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"description":"Internal Server Error","type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/image-alt-tag-generator/usage":{"get":{"summary":"Image Alt Tag Generator usage","tags":["Free Tools"],"description":"Return yearly usage for Image Alt Tag Generator free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/json-ld-generator/":{"post":{"summary":"JSON-LD Generator","tags":["Free Tools"],"description":"Generate Schema.org JSON-LD from a URL or pasted content. The schema type is auto-detected from the content by AI — no type selection required.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["url","manual"]},"input":{"type":"string"}},"required":["mode","input"]}}}},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/json-ld-generator/usage":{"get":{"summary":"JSON-LD Generator usage","tags":["Free Tools"],"description":"Return yearly usage for the JSON-LD Generator free tool.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/keyword-research/":{"post":{"summary":"Free Keyword Research","tags":["Free Tools"],"description":"Search keywords via Google Ads Keyword Planner (free tier)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string"},"url":{"type":"string"},"country":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"captchaToken":{"type":"string"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/keyword-research/usage":{"get":{"summary":"Keyword Research usage","tags":["Free Tools"],"description":"Return usage for Keyword Research free tool","responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/llms-txt/":{"post":{"summary":"LLMs Txt Generator","tags":["Free Tools"],"description":"Generate llms.txt for a website","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/llms-txt/usage":{"get":{"summary":"LLMs Txt Generator usage","tags":["Free Tools"],"description":"Return usage for LLMs Txt Generator free tool","responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/meta-description-generator/":{"post":{"summary":"Meta Description Generator","tags":["Free Tools"],"description":"Generate SEO-optimized meta descriptions based on website content.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string","description":"Text content or website URL to analyze"},"mode":{"type":"string","enum":["website","text"],"description":"Whether 'input' is a URL or raw text"}},"required":["input","mode"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"descriptions":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"characterCount":{"type":"number"}}}}}}}}},"400":{"description":"Website is required","content":{"application/json":{"schema":{"description":"Website is required","type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Too Many Requests","content":{"application/json":{"schema":{"description":"Too Many Requests","type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"description":"Internal Server Error","type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/meta-description-generator/usage":{"get":{"summary":"Meta Description Generator usage","tags":["Free Tools"],"description":"Return yearly usage for Meta Description Generator free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/meta-title-generator/":{"post":{"summary":"Meta Title Generator","tags":["Free Tools"],"description":"Generate SEO-optimized meta titles based on URL or text content.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string"},"mode":{"type":"string","enum":["website","text"]}},"required":["input","mode"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"titles":{"type":"array","items":{"type":"object","properties":{"text":{"type":"string"},"characterCount":{"type":"number"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/meta-title-generator/usage":{"get":{"summary":"Meta Title Generator usage","tags":["Free Tools"],"description":"Return yearly usage for Meta Title Generator free tool.","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/page-speed/":{"post":{"summary":"Page Speed Analyzer","tags":["Free Tools"],"description":"Analyze a URL for page speed","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/page-speed/usage":{"get":{"summary":"Page Speed usage","tags":["Free Tools"],"description":"Return usage for Page Speed free tool","responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/readability/simplify":{"post":{"summary":"Simplify Text","tags":["Free Tools"],"description":"Simplify text to match the target grade level using AI","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","minLength":50},"targetGradeLevel":{"type":"number","minimum":1,"maximum":12}},"required":["text","targetGradeLevel"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/readability/rewrite-sentence":{"post":{"summary":"Rewrite Sentence","tags":["Free Tools"],"description":"Rewrite a signle sentence using AI for better readability","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sentence":{"type":"string","minLength":10}},"required":["sentence"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/readability/crawl":{"post":{"summary":"Readability Check via Crawl","tags":["Free Tools"],"description":"Crawl a URL and analyze its readability","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/readability/analyze":{"post":{"summary":"Readability Analyze Text","tags":["Free Tools"],"description":"Analyze raw text for readability","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","minLength":50,"maxLength":50000}},"required":["text"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/readability/usage":{"get":{"summary":"Readability Check usage","tags":["Free Tools"],"description":"Return usage for Readability Check free tool","responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/seo-audit/":{"post":{"summary":"Audit Website URL for SEO","tags":["Free Tools"],"description":"Run SEO audit analysis on a given URL","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"]}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/seo-audit/usage":{"get":{"summary":"SEO Audit usage","tags":["Free Tools"],"description":"Return usage for Free SEO Audit","responses":{"200":{"description":"Default Response"}}}},"/v3/free-tools/sitemap-checker/":{"post":{"summary":"Sitemap Checker","tags":["Free Tools"],"description":"Check if a given website has a valid sitemap.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"websiteUrl":{"type":"string"}},"required":["websiteUrl"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"websiteUrl":{"type":"string"},"foundInRobotsTxt":{"type":"boolean"},"sitemaps":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"urlCount":{"type":"number"},"lastModified":{"type":"string","nullable":true},"type":{"type":"string","enum":["sitemap","index"]}}}},"totalUrls":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/sitemap-checker/usage":{"get":{"summary":"Sitemap Checker usage","tags":["Free Tools"],"description":"Return yearly usage for Sitemap Checker free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/sitemap-validator/":{"post":{"summary":"Sitemap Validator","tags":["Free Tools"],"description":"Validate the schema and correctness of an XML sitemap.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sitemapUrl":{"type":"string"}},"required":["sitemapUrl"]}}}},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/sitemap-validator/usage":{"get":{"summary":"Sitemap Validator usage","tags":["Free Tools"],"description":"Return yearly usage for Sitemap Validator free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/free-tools/xml-sitemap-generator/":{"post":{"summary":"XML Sitemap Generator","tags":["Free Tools"],"description":"Crawl website and generate an XML sitemap","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"}},"required":["url"]}}}},"responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"description":"Successful response","type":"object","properties":{"content":{"type":"string"},"graph":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"parentUrl":{"type":"string","nullable":true},"depth":{"type":"number"},"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"statusCode":{"type":"number"},"error":{"type":"string"},"message":{"type":"string"},"retryAfterSeconds":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/free-tools/xml-sitemap-generator/usage":{"get":{"summary":"XML Sitemap Generator usage","tags":["Free Tools"],"description":"Return yearly usage for XML Sitemap Generator free tool","responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"total":{"type":"number"},"remaining":{"type":"number"},"resetInMs":{"type":"number"}},"required":["total","remaining"]}}}}}}},"/v3/generate-ai-image/":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/check-cannibalization/":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/create-and-start/":{"post":{"summary":"Generate a full article from a brief (one-shot)","tags":["Generate Article"],"description":"Create and generate a complete SnowSEO article in one call (the automated, one-shot flow). Provide only the high-level brief — the type-specific outline, target keywords, and FAQ prompts are all produced for you (so coverage is populated), and you never have to write or pass them yourself. Every article must belong to a topic cluster: pass a `topicId` from `topic_clusters_list` (or create one with `create_topic_cluster`); the topic name comes from that cluster. Ask the user for the `length` tier (it sets the credit cost). CONSUMES CREDITS: always ask the user for permission before calling this. It returns right away with `{ slug, generating, status }` while the article is written in the background; poll `generation_status` with that slug until it is no longer generating, then read the article with `get_article`. For step-by-step control instead, use the wizard (`create_article` → `generate_titles`/`generate_outline`/`generate_keywords`/`generate_prompts` → `start_article_generation`). Set `startGeneration:false` to create only the draft (and call `start_article_generation` later).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","topicId","length"],"properties":{"teamId":{"type":"string","description":"Team id (falls back to the session's active project)."},"title":{"type":"string","description":"Article title / headline."},"type":{"type":"string","enum":["listicle","comparison","news","review","guide"],"description":"Article type. Defaults to listicle."},"contentArticleType":{"type":"string","enum":["pillar","cluster"],"description":"Pillar or cluster role in a topic cluster. Omit for a standalone post."},"primaryKeywords":{"type":"array","items":{"type":"string"},"description":"Primary target keywords."},"secondaryKeywords":{"type":"array","items":{"type":"string"},"description":"Secondary keywords."},"promptInsights":{"type":"array","items":{"type":"string"},"description":"Questions / search intents the article should answer."},"topicId":{"type":"string","description":"Required. Id of the team's topic cluster this article belongs to — get it from `topic_clusters_list`, or create one with `create_topic_cluster`. The topic name is taken from this cluster; do not pass a free-text topic."},"competitorUrls":{"type":"array","items":{"type":"string"},"description":"Up to 5 competitor article URLs to inform the outline's competitive analysis."},"length":{"type":"string","enum":["short","medium","long"],"description":"Required length tier — short: 800–1000 words (~100 credits), medium: 1800–2000 words (~200 credits), long: 2800–3000 words (~300 credits). Ask the user which tier they want before calling, since it sets the credit cost."},"tone":{"type":"string","description":"Writing tone (e.g. 'Professional', 'Casual'). Defaults to professional."},"customInstructions":{"type":"string","description":"Optional free-text writing instructions for THIS article only (focus, angle, things to include or avoid). Ask the user if they have any; if omitted, the brand's default content guidelines still apply automatically."},"customInstructionsUseWithBrand":{"type":"boolean","description":"When true (default), the article's custom instructions apply together with the brand's content guidelines. When false, they replace the brand guidelines for this article."},"internalLinkTargetSlugs":{"type":"array","items":{"type":"string"},"description":"Slugs of existing SnowSEO articles to link out to."},"internalLinkTargetUrls":{"type":"array","items":{"type":"string"},"description":"Absolute http(s) URLs to link out to."},"includeTldr":{"type":"boolean","description":"Include a TL;DR section. Defaults to true."},"includeFaq":{"type":"boolean","description":"Include an FAQ section. Defaults to true."},"includeConclusion":{"type":"boolean","description":"Include a conclusion (ignored for listicles). Defaults to true."},"includeCta":{"type":"boolean","description":"Include a CTA section. Defaults to false."},"startGeneration":{"type":"boolean","description":"Start content generation now (default true). False creates only the draft."},"language":{"type":"string","description":"Language code to write this article in (e.g. 'es'). Usually two letters; Chinese is 'zh_CN'/'zh_TW' and Hebrew is 'iw'. Defaults to the brand's Writing Language, then its brand language. Only pass this when the user asks for a specific language for this one article."}}}}}},"x-mcp":{"name":"generate_article"},"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/generate-internal-links/":{"get":{"summary":"Suggest internal links for an article","tags":["Generate Article"],"description":"Suggest the most relevant existing SnowSEO articles to link to from a new article, ranked by relevance. Pass the returned target slugs to `create_article` / `generate_article` as `internalLinkTargetSlugs`.","parameters":[{"schema":{"type":"string"},"in":"query","name":"current_title","required":true,"description":"Title of the article that will link out."},{"schema":{"type":"string"},"in":"query","name":"topic_id","required":false,"description":"Topic cluster id (required when content_article_type is set)."},{"schema":{"type":"string","enum":["pillar","cluster"]},"in":"query","name":"content_article_type","required":false,"description":"Omit for a standalone post."},{"schema":{"type":"string"},"in":"query","name":"exclude_article_slug","required":false,"description":"Slug to exclude from suggestions (e.g. the article itself)."},{"schema":{"type":"string"},"in":"query","name":"team_id","required":false}],"x-mcp":{"name":"generate_internal_links"},"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/generate-keywords/":{"get":{"summary":"Generate target keywords for an article","tags":["Generate Article"],"description":"Generate ranked target keywords (with search volume and relevance) for an article title. Optionally crawls competitor URLs to mine keywords. Use the chosen keywords when calling `generate_outline` / `generate_article`.","parameters":[{"schema":{"type":"string"},"in":"query","name":"title","required":true,"description":"Article title to generate keywords for."},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"user_keywords","required":false,"description":"Existing keywords to prioritize and expand."},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"competitor_links","required":false,"description":"Competitor article URLs to crawl for keyword mining."},{"schema":{"type":"string"},"in":"query","name":"keyword_count","required":false,"description":"How many keywords to return (1–40, default 10)."},{"schema":{"type":"string"},"in":"query","name":"country","required":false},{"schema":{"type":"string"},"in":"query","name":"language","required":false}],"x-mcp":{"name":"generate_keywords"},"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/generate-outline/":{"get":{"summary":"Generate a structured, type-specific article outline","tags":["Generate Article"],"description":"Generates the structured outline for an article (listicle/guide/comparison/review/news) from a title + keywords + optional prompt insights and competitor URLs. The outline MUST be produced by this tool — its shape is type-specific and strict. Returns `{ outline, auto_selections, competitive_analysis, optimization_scope }`. To create an article from it, pass the WHOLE returned object as `articleOutline.generateOutlineResponse` to `create_article` (or just use the one-shot `generate_article`).","parameters":[{"schema":{"type":"string"},"in":"query","name":"title","required":true,"description":"Article title (required)."},{"schema":{"type":"string","enum":["listicle","comparison","news","review","guide"]},"in":"query","name":"type","required":false,"description":"Article type. Defaults to listicle. Selects the outline structure."},{"schema":{"type":"string","enum":["pillar","cluster"]},"in":"query","name":"content_article_type","required":false,"description":"Omit for a standalone post."},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"primary_keywords","required":false,"description":"Primary target keywords."},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"secondary_keywords","required":false,"description":"Secondary keywords."},{"schema":{"type":"string"},"in":"query","name":"prompt_insights_json","required":false,"description":"JSON-stringified array of prompt-insight rows the article should answer."},{"schema":{"type":"string"},"in":"query","name":"article_topic","required":false,"description":"Topic cluster the article belongs to."},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"competitor_articles","required":false,"description":"Up to 5 competitor article URLs to inform competitive analysis."},{"schema":{"type":"string"},"in":"query","name":"length","required":false,"description":"Target word count: 'auto', a number like '1900', or a label."},{"schema":{"type":"string"},"in":"query","name":"tone","required":false},{"schema":{"type":"string"},"in":"query","name":"audience","required":false},{"schema":{"type":"string"},"in":"query","name":"country","required":false},{"schema":{"type":"string"},"in":"query","name":"language","required":false}],"x-mcp":{"name":"generate_outline"},"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/generate-prompts/":{"get":{"summary":"Generate FAQ-style prompts for an article","tags":["Generate Article"],"description":"Generate ranked search-style/FAQ questions a reader would ask about the article's topic — useful as `promptInsights` for `generate_article` or as FAQ section seeds. Requires the article title and its topic cluster.","parameters":[{"schema":{"type":"string"},"in":"query","name":"title","required":true,"description":"Article title."},{"schema":{"type":"string"},"in":"query","name":"articleTopic","required":true,"description":"Topic cluster the article belongs to."},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"competitor_articles","required":false,"description":"Up to 5 competitor article URLs to inform the prompts."},{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"country","required":false},{"schema":{"type":"string"},"in":"query","name":"language","required":false}],"x-mcp":{"name":"generate_prompts"},"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/generate-titles/":{"get":{"summary":"Generate article title ideas","tags":["Generate Article"],"description":"Generate SEO-friendly article title suggestions for a topic cluster. Pass the chosen cluster's name as `topics`. First step before `generate_outline` / `generate_article`.","parameters":[{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"topics","required":false,"description":"Topic cluster name(s) to base titles on — normally the cluster the user already selected."},{"schema":{"type":"string","enum":["listicle","comparison","news","review","guide"]},"in":"query","name":"type","required":false,"description":"Article type. Defaults to listicle. Must match the outline's structure."},{"schema":{"type":"string"},"in":"query","name":"count","required":false,"description":"How many titles to return (1–20, default 8)."},{"schema":{"type":"string","enum":["pillar","cluster"]},"in":"query","name":"contentArticleType","required":false,"description":"Omit for a standalone post."},{"schema":{"type":"string"},"in":"query","name":"country","required":false},{"schema":{"type":"string"},"in":"query","name":"language","required":false}],"x-mcp":{"name":"generate_titles"},"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/generation-status/":{"get":{"summary":"Article generation status","tags":["Generate Article"],"description":"Check whether an article is currently being generated or updated, and how far along it is. Poll this after `generate_article` / `start_article_generation`: once it is no longer generating, the article is ready (`status` becomes `generated`) — then read it with `get_article`. `error` is set if generation failed.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team id (falls back to the session's active project)."},{"schema":{"type":"string"},"in":"query","name":"slug","required":true,"description":"Article slug."}],"x-mcp":{"name":"generation_status"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"articleId":{"type":"string"},"status":{"type":"string","description":"Lifecycle status (draft/generated/published…)."},"generating":{"type":"boolean"},"kind":{"type":"string","nullable":true,"description":"\"generate\" | \"update\" while generating."},"phase":{"type":"string","nullable":true},"progress":{"type":"number","nullable":true},"enrichmentPhase":{"type":"string","nullable":true,"description":"Post-content JSON-LD/audit phase, independent of `generating`."},"error":{"type":"string","nullable":true}},"additionalProperties":true}}}}}}},"/v3/generate-article/generation-stream/":{"get":{"summary":"Live generation event stream (NDJSON keep-alive)","tags":["Generate Article"],"description":"Long-lived NDJSON keep-alive stream of generation events. Replays the buffered events from `lastId` (default: from the start), then tails new ones live. Each line is a JSON object `{ id, type, data }` where `type` ∈ chunk | flush | media | tldr | toc | metadata | phase | done | error | end. NOT a JSON response — consume as a stream and reconnect with `?lastId=` (the last seen id) if the socket drops. Ends on a terminal (done/error) event, when generation is no longer active, on a safety timeout, or on client disconnect.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team id (falls back to the session's active project)."},{"schema":{"type":"string"},"in":"query","name":"slug","required":true,"description":"Article slug."},{"schema":{"type":"string"},"in":"query","name":"lastId","required":false,"description":"Resume from this Redis stream id (exclusive). Omit to replay from the beginning."}],"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/get-competitor-sources/":{"get":{"summary":"Find competitor articles for a topic","tags":["Generate Article"],"description":"Web-search for competitor articles/blog posts on a topic (homepages and your own site are excluded). Use the returned URLs as `competitorUrls` / `competitor_articles` in the keyword, prompt, and outline steps.","parameters":[{"schema":{"type":"string"},"in":"query","name":"query","required":true,"description":"Topic or search query to find competitor articles for."},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Two-letter country code (default US)."},{"schema":{"type":"string"},"in":"query","name":"search_lang","required":false,"description":"Search language code (default en)."},{"schema":{"type":"string"},"in":"query","name":"excludeSite","required":false,"description":"Domain to exclude from results (defaults to your brand's website)."}],"x-mcp":{"name":"find_competitor_sources"},"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/plan-topic/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/reangle/":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-article/start/":{"post":{"summary":"Start article generation","tags":["Generate Article"],"description":"Start generating content for an existing draft article (one created by `create_article`) — the wizard's final step. CONSUMES CREDITS: always ask the user for permission before calling this (the earlier wizard steps — titles, outline, keywords, prompts — are free). Generation runs in the background — poll `generation_status` with the same slug until it is no longer generating, then read the result with `get_article`. Calling this again while a run is already in progress is safe and will not start a duplicate.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["slug"],"properties":{"teamId":{"type":"string","description":"Team id (falls back to the session's active project)."},"slug":{"type":"string","description":"Slug of the draft article to generate."},"customInstructions":{"type":"string","description":"Optional free-text writing instructions for this article, layered on top of the team's default content guidelines. Persists onto the article for future regenerations. Omit to leave the stored value unchanged; send an empty string to clear it."},"customInstructionsUseWithBrand":{"type":"boolean","description":"When true (default), the article's custom instructions are applied together with the brand's content guidelines. When false, they replace the brand guidelines for this article. Persists onto the article."},"targetWordCount":{"type":"integer","minimum":300,"maximum":10000,"description":"Target article length in words. Only used when the draft has NO outline yet - the worker plans one and this sets its size (and the credit cost). Ignored when an outline already exists, since its own target wins. Defaults to 1900."}}}}}},"x-mcp":{"name":"start_article_generation"},"responses":{"200":{"description":"Success: `{ success:true, generating:true, slug }` (+ `alreadyRunning:true` when a run was already in flight). Insufficient credits: `{ success:false, generating:false, requiredCredits, message }`.","content":{"application/json":{"schema":{"type":"object","description":"Success: `{ success:true, generating:true, slug }` (+ `alreadyRunning:true` when a run was already in flight). Insufficient credits: `{ success:false, generating:false, requiredCredits, message }`.","properties":{"success":{"type":"boolean"},"generating":{"type":"boolean"},"slug":{"type":"string"},"requiredCredits":{"type":"number"},"message":{"type":"string"},"alreadyRunning":{"type":"boolean"}},"additionalProperties":true}}}}}}},"/v3/generate-jsonld/":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/generate-tldr/":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/geo-audit/site":{"post":{"operationId":"runGeoSiteAudit","summary":"Run a site-wide GEO audit","tags":["GEO Audit"],"description":"Starts a GEO (generative engine optimisation) audit of the site — how well its content can be understood and cited by AI answer engines. Runs in the background; poll geo_audit_status for progress and read the result with geo_audit_site. Consumes plan credits and requires an active plan.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId"],"properties":{"teamId":{"type":"string","minLength":1,"description":"SnowSEO team ID. Call list_teams first to choose a team."},"url":{"type":"string","description":"Optional site URL to audit. Defaults to the team's configured website."}}}}}},"x-mcp":{"name":"run_geo_audit","teamScoped":true},"responses":{"200":{"description":"Default Response"}}},"get":{"operationId":"getGeoSiteAudit","summary":"Get the site-wide GEO audit result","tags":["GEO Audit"],"description":"The latest stored GEO (generative engine optimisation) audit for the site: how well its content is structured for AI answer engines, with the overall score and the checks behind it. Read-only; run_geo_audit produces this.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"url","required":false,"description":"Optional site URL. Defaults to the team's configured website."}],"x-mcp":{"name":"geo_audit_site","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/geo-audit/active-job":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/geo-audit/job-status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/geo-audit/pages":{"get":{"operationId":"listGeoPageAudits","summary":"List GEO scores per page","tags":["GEO Audit"],"description":"Per-page GEO (generative engine optimisation) scores across the site, showing which pages are best and worst prepared to be cited by AI answer engines. Use this to find pages worth improving for AI visibility.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"url","required":false,"description":"Optional site URL. Defaults to the team's configured website."}],"x-mcp":{"name":"geo_audit_pages","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/geo-audit/page":{"get":{"operationId":"getGeoPageAudit","summary":"Get one page's full GEO audit","tags":["GEO Audit"],"description":"The complete GEO (generative engine optimisation) breakdown for a single page: every check, what it found, and why it passed or failed. Use geo_audit_pages first to pick a page worth drilling into.","parameters":[{"schema":{"type":"string","minLength":1},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string","minLength":1},"in":"query","name":"link","required":true,"description":"Full URL of the page to report on, e.g. https://example.com/pricing."}],"x-mcp":{"name":"geo_audit_page","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/bing/connect":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/bing/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/bing/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/bing/properties":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/bing/set-property":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/bing/website-traffic/search-queries":{"get":{"operationId":"getBingSearchQueries","summary":"Get Bing search queries","tags":["Bing Webmaster Tools"],"description":"Returns top Bing Webmaster Tools search queries with clicks, impressions, CTR, and position.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Maximum rows to return"}],"x-mcp":{"name":"bing_search_queries"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/bing/website-traffic/stats":{"get":{"operationId":"getBingTrafficStats","summary":"Get Bing traffic stats","tags":["Bing Webmaster Tools"],"description":"Returns Bing Webmaster Tools clicks, impressions, CTR, and position with daily trends and a change vs the previous period. Pass includePrevious=true to also get the previous period's four daily trend arrays.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Maximum rows to return"},{"schema":{"type":"string"},"in":"query","name":"includePrevious","required":false,"description":"Include previous-period comparison values alongside each data point (roughly doubles the time-series payload). Defaults to false."}],"x-mcp":{"name":"bing_traffic_stats"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/bing/website-traffic/top-pages":{"get":{"operationId":"getBingTopPages","summary":"Get Bing top pages","tags":["Bing Webmaster Tools"],"description":"Returns top Bing Webmaster Tools pages with clicks, impressions, CTR, and position.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Maximum rows to return"}],"x-mcp":{"name":"bing_top_pages"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/bing/website-traffic/backlinks":{"get":{"operationId":"getBingBacklinks","summary":"Get Bing backlinks","tags":["Bing Webmaster Tools"],"description":"Returns Bing Webmaster Tools backlink domains, pages, and anchor text summaries.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"}],"x-mcp":{"name":"bing_backlinks"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/framer/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/framer/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/framer/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/framer/server-api/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/framer/server-api/collections":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/framer/server-api/configure":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/get":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/property":{"patch":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/traffic/overview":{"get":{"operationId":"getGaTraffic","summary":"Get GA traffic overview","tags":["Google Analytics"],"description":"Returns Google Analytics traffic overview (sessions, users, pageviews) with period-over-period changes.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional dimension filters"}],"x-mcp":{"name":"ga_traffic_overview"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"sessions":{"type":"number"},"users":{"type":"number"},"pageviews":{"type":"number"},"sessionsChange":{"type":"object","nullable":true,"additionalProperties":true},"usersChange":{"type":"object","nullable":true,"additionalProperties":true},"pageviewsChange":{"type":"object","nullable":true,"additionalProperties":true}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/integrations/ga/behavior/engagement":{"get":{"operationId":"getGaEngagement","summary":"Get GA engagement metrics","tags":["Google Analytics"],"description":"Returns Google Analytics engagement rate with period-over-period comparison.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_engagement"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/chart/overview":{"get":{"operationId":"getGaChart","summary":"Get GA chart data","tags":["Google Analytics"],"description":"Returns Google Analytics sessions, users and pageviews per day. Pass includePrevious=true to also get the previous period's values on each point (costs a second Analytics query).","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional dimension filters"},{"schema":{"type":"string"},"in":"query","name":"includePrevious","required":false,"description":"Include previous-period comparison values alongside each data point (roughly doubles the time-series payload). Defaults to false."}],"x-mcp":{"name":"ga_overview"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["chartData"],"properties":{"chartData":{"type":"array","items":{"type":"object","required":["date","sessions","users","pageviews"],"properties":{"date":{"type":"string"},"sessions":{"type":"number"},"users":{"type":"number"},"pageviews":{"type":"number"},"prevSessions":{"type":"number","nullable":true},"prevUsers":{"type":"number","nullable":true},"prevPageviews":{"type":"number","nullable":true}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/integrations/ga/sources/overview":{"get":{"operationId":"getGaSources","summary":"Get GA traffic sources","tags":["Google Analytics"],"description":"Returns Google Analytics source and referral-source breakdowns.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_sources"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/channels/":{"get":{"operationId":"getGaChannels","summary":"Get GA traffic channels","tags":["Google Analytics"],"description":"Returns Google Analytics sessions grouped into canonical traffic channels.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_channels"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/countries/overview":{"get":{"operationId":"getGaCountries","summary":"Get GA country breakdown","tags":["Google Analytics"],"description":"Returns Google Analytics sessions, users, and pageviews by country.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_countries"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/pages/overview":{"get":{"operationId":"getGaPages","summary":"Get GA pages","tags":["Google Analytics"],"description":"Returns Google Analytics top pages with pageviews, users, entrances, and exits.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_pages"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/devices/overview":{"get":{"operationId":"getGaDevices","summary":"Get GA devices","tags":["Google Analytics"],"description":"Returns Google Analytics sessions, users, and pageviews by device category.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_devices"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/devices/browsers/":{"get":{"operationId":"getGaBrowsers","summary":"Get GA browsers","tags":["Google Analytics"],"description":"Returns Google Analytics sessions, users, and pageviews by browser.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_browsers"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/devices/os/":{"get":{"operationId":"getGaOperatingSystems","summary":"Get GA operating systems","tags":["Google Analytics"],"description":"Returns Google Analytics sessions, users, and pageviews by operating system.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_operating_systems"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/avg-duration/":{"get":{"operationId":"getGaAvgDuration","summary":"Get GA average session duration","tags":["Google Analytics"],"description":"Returns Google Analytics average session duration with period-over-period comparison.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_avg_duration"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/user-type/":{"get":{"operationId":"getGaUserType","summary":"Get GA new vs returning users","tags":["Google Analytics"],"description":"Returns Google Analytics new and returning user split with comparison.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_user_type"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/campaigns/overview":{"get":{"operationId":"getGaCampaigns","summary":"Get GA campaigns","tags":["Google Analytics"],"description":"Returns Google Analytics campaign performance with sessions, engagement, and duration.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"ga_campaigns"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ga/filter-values":{"get":{"operationId":"getGaFilterValues","summary":"Get GA filter values","tags":["Google Analytics"],"description":"Returns Google Analytics distinct filter values for analytics dimensions.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"},{"schema":{"type":"string"},"in":"query","name":"dimension","required":true,"description":"Filter dimension to list values for"},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Optional search text for filtering returned values"}],"x-mcp":{"name":"ga_filter_values"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ghost/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ghost/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/ghost/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gmail/connect":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/google-pagespeed/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/google-pagespeed/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/google-pagespeed/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/grigora/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/grigora/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/grigora/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/connect":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/properties":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/property":{"patch":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/website-traffic/stats":{"get":{"operationId":"getGscTraffic","summary":"Get GSC traffic stats","tags":["GSC"],"description":"Returns Google Search Console traffic stats (clicks, impressions, CTR, position) with daily trends and a change vs the previous period. Pass includePrevious=true to also get the previous period's four daily trend arrays.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"ISO start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"ISO end date (YYYY-MM-DD)"},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"device","required":false,"description":"Device filter"},{"schema":{"type":"string"},"in":"query","name":"type","required":false,"description":"Search type filter"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"type":"string"},"in":"query","name":"includePrevious","required":false,"description":"Include previous-period comparison values alongside each data point (roughly doubles the time-series payload). Defaults to false."}],"x-mcp":{"name":"gsc_traffic_stats"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"totalClicks":{"type":"number"},"totalImpressions":{"type":"number"},"averageCTR":{"type":"number"},"averagePosition":{"type":"number"},"clicksTrend":{"type":"array","items":{"type":"object","additionalProperties":true}},"impressionsTrend":{"type":"array","items":{"type":"object","additionalProperties":true}},"ctrTrend":{"type":"array","items":{"type":"object","additionalProperties":true}},"positionTrend":{"type":"array","items":{"type":"object","additionalProperties":true}},"prevClicksTrend":{"type":"array","items":{"type":"object","additionalProperties":true}},"prevImpressionsTrend":{"type":"array","items":{"type":"object","additionalProperties":true}},"prevCtrTrend":{"type":"array","items":{"type":"object","additionalProperties":true}},"prevPositionTrend":{"type":"array","items":{"type":"object","additionalProperties":true}},"clicksChange":{"type":"object","additionalProperties":true},"impressionsChange":{"type":"object","additionalProperties":true},"ctrChange":{"type":"object","additionalProperties":true},"positionChange":{"type":"object","additionalProperties":true},"coverage":{"type":"object","additionalProperties":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/integrations/gsc/website-traffic/top-pages":{"get":{"operationId":"getGscTopPages","summary":"Get Search Console top pages","tags":["Google Search Console"],"description":"Returns top Google Search Console pages with clicks, impressions, CTR, and position.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"type":"string"},"in":"query","name":"device","required":false,"description":"Device filter"},{"schema":{"type":"string"},"in":"query","name":"type","required":false,"description":"Search appearance/type filter"},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Maximum rows to return"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"keywords","required":false,"description":"Optional keyword filters"}],"x-mcp":{"name":"gsc_top_pages"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/website-traffic/page-changes":{"get":{"operationId":"getGscPageChanges","summary":"Get Search Console page changes","tags":["Google Search Console"],"description":"Returns Google Search Console page performance changes for the selected window.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"type":"string"},"in":"query","name":"device","required":false,"description":"Device filter"},{"schema":{"type":"string"},"in":"query","name":"type","required":false,"description":"Search appearance/type filter"},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Maximum rows to return"}],"x-mcp":{"name":"gsc_page_changes"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/website-traffic/search-queries":{"get":{"operationId":"getGscSearchQueries","summary":"Get Search Console search queries","tags":["Google Search Console"],"description":"Returns Google Search Console search queries with clicks, impressions, CTR, average position and the change in each against the previous period of the same length. Ranked by clicks: `limit` defaults to 50 and accepts up to 25000, and the response reports `total` (every query in the window) alongside `returned`, so check those before treating the rows as the full set. `coverage` reports the window Google actually served and whether its newest days are still being collected.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"type":"string"},"in":"query","name":"device","required":false,"description":"Device filter"},{"schema":{"type":"string"},"in":"query","name":"type","required":false,"description":"Search appearance/type filter"},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Maximum rows to return"},{"schema":{"type":"string"},"in":"query","name":"includePages","required":false,"description":"Embed each row's ranking page URLs and their metrics inside the row (multiplies the payload by the number of URLs per row). Defaults to false; the `pages` count is always returned."}],"x-mcp":{"name":"gsc_search_queries"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/website-traffic/pages-for-keyword":{"get":{"operationId":"getGscPagesForKeyword","summary":"Get Search Console pages for keyword","tags":["Google Search Console"],"description":"Returns Google Search Console pages ranking for one search query keyword.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"type":"string"},"in":"query","name":"device","required":false,"description":"Device filter"},{"schema":{"type":"string"},"in":"query","name":"type","required":false,"description":"Search appearance/type filter"},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Maximum rows to return"},{"schema":{"type":"string"},"in":"query","name":"keyword","required":true,"description":"Search query keyword"}],"x-mcp":{"name":"gsc_pages_for_keyword"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/website-traffic/keywords-for-page":{"get":{"operationId":"getGscKeywordsForPage","summary":"Get Search Console keyword position history for a page","tags":["Google Search Console"],"description":"Returns the keywords a page ranks for, each with a daily average-position time series over the selected window.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"type":"string"},"in":"query","name":"device","required":false,"description":"Device filter"},{"schema":{"type":"string"},"in":"query","name":"type","required":false,"description":"Search appearance/type filter"},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Maximum rows to return"},{"schema":{"type":"string"},"in":"query","name":"page","required":true,"description":"Page URL"}],"x-mcp":{"name":"gsc_keywords_for_page"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/website-traffic/devices":{"get":{"operationId":"getGscDevices","summary":"Get Search Console device breakdown","tags":["Google Search Console"],"description":"Returns Google Search Console clicks, impressions, CTR, and position by device.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"type":"string"},"in":"query","name":"device","required":false,"description":"Device filter"}],"x-mcp":{"name":"gsc_devices"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/gsc/website-traffic/countries":{"get":{"operationId":"getGscCountries","summary":"Get Search Console country breakdown","tags":["Google Search Console"],"description":"Returns Google Search Console clicks, impressions, CTR, and position by country.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"type":"string"},"in":"query","name":"device","required":false,"description":"Device filter"}],"x-mcp":{"name":"gsc_countries"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/indexnow/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/indexnow/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/indexnow/verify":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/indexnow/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/indexnow/submit":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/outlook/connect":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/analytics":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/chart/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/sources/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/countries/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/devices/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/browsers/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/os/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/pages/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/user-type/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/avg-duration/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/campaigns/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/channels/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/plausible/filter-values/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/analytics":{"get":{"operationId":"getPosthogPageCounts","summary":"Get PostHog page counts","tags":["PostHog"],"description":"Returns PostHog page-level visitor counts for the team website.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_page_counts"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/sources/":{"get":{"operationId":"getPosthogSources","summary":"Get PostHog traffic sources","tags":["PostHog"],"description":"Returns PostHog source and referral-source breakdowns.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_sources"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/countries/":{"get":{"operationId":"getPosthogCountries","summary":"Get PostHog country breakdown","tags":["PostHog"],"description":"Returns PostHog sessions, users, and pageviews by country.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_countries"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/devices/":{"get":{"operationId":"getPosthogDevices","summary":"Get PostHog devices","tags":["PostHog"],"description":"Returns PostHog sessions, users, and pageviews by device category.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_devices"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/browsers/":{"get":{"operationId":"getPosthogBrowsers","summary":"Get PostHog browsers","tags":["PostHog"],"description":"Returns PostHog sessions, users, and pageviews by browser.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_browsers"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/os/":{"get":{"operationId":"getPosthogOperatingSystems","summary":"Get PostHog operating systems","tags":["PostHog"],"description":"Returns PostHog sessions, users, and pageviews by operating system.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_operating_systems"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/pages/":{"get":{"operationId":"getPosthogPages","summary":"Get PostHog pages","tags":["PostHog"],"description":"Returns PostHog top pages with pageviews, users, entrances, and exits.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_pages"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/user-type/":{"get":{"operationId":"getPosthogUserType","summary":"Get PostHog new vs returning users","tags":["PostHog"],"description":"Returns PostHog new and returning user split with comparison.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_user_type"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/chart/":{"get":{"operationId":"getPosthogChart","summary":"Get PostHog chart data","tags":["PostHog"],"description":"Returns PostHog pageview analytics chart data (sessions, users, pageviews) per day.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional PostHog property filters"}],"x-mcp":{"name":"posthog_overview"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["chartData"],"properties":{"chartData":{"type":"array","items":{"type":"object","required":["date","sessions","users","pageviews"],"properties":{"date":{"type":"string"},"sessions":{"type":"number"},"users":{"type":"number"},"pageviews":{"type":"number"}}}}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/integrations/posthog/avg-duration/":{"get":{"operationId":"getPosthogAverageDuration","summary":"Get PostHog average duration","tags":["PostHog"],"description":"Returns PostHog average session duration with comparison.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_avg_duration"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/campaigns/":{"get":{"operationId":"getPosthogCampaigns","summary":"Get PostHog campaigns","tags":["PostHog"],"description":"Returns PostHog campaign performance with sessions, users, and pageviews.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_campaigns"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/channels/":{"get":{"operationId":"getPosthogChannels","summary":"Get PostHog traffic channels","tags":["PostHog"],"description":"Returns PostHog sessions grouped into canonical traffic channels.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"}],"x-mcp":{"name":"posthog_channels"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/posthog/filter-values/":{"get":{"operationId":"getPosthogFilterValues","summary":"Get PostHog filter values","tags":["PostHog"],"description":"Returns PostHog distinct filter values for analytics dimensions.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"Team ID"},{"schema":{"anyOf":[{"type":"string"},{"type":"integer"}]},"in":"query","name":"days","required":false,"description":"Number of days to look back"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"filters","required":false,"description":"Additional analytics property filters"},{"schema":{"type":"string"},"in":"query","name":"dimension","required":true,"description":"Filter dimension to list values for"},{"schema":{"type":"string"},"in":"query","name":"search","required":false,"description":"Optional search text for filtering returned values"}],"x-mcp":{"name":"posthog_filter_values"},"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/shopify/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/shopify/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/shopify/configure":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/shopify/blogs/refresh":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/shopify/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/webflow/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/webflow/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/webflow/switch":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/webflow/configure":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/webflow/refresh-collections":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/webflow/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/wordpress/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/wordpress/connect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/wordpress/disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/wordpress/generate-key":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/wordpress/connection-status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/wordpress/latest-version":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/integrations/wordpress/plugin-disconnect":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/keyword-research/":{"get":{"summary":"Generate keyword ideas","tags":["keyword-research"],"description":"Return keyword suggestions with search volume, competition level, and CPC data.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"keyword","required":false,"description":"Seed keyword. Required if `page_url` is omitted."},{"schema":{"type":"string","anyOf":[{"type":"string","maxLength":0},{"type":"string","format":"uri","minLength":1}]},"in":"query","name":"page_url","required":false,"description":"Seed URL. Required if `keyword` is omitted. Empty string allowed when using keyword."},{"schema":{"type":"string"},"in":"query","name":"location_ids","required":false,"description":"Comma-separated location IDs (e.g. \"2840,2826\"). Use \"all\" for worldwide; it can be combined with specific IDs (e.g. \"all,2380\"). Omitted = worldwide."},{"schema":{"type":"string","default":"1000"},"in":"query","name":"language_id","required":false,"description":"Google Ads language resource ID (default: \"1000\" = English)."}],"x-mcp":{"name":"keyword_research"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["exact_keyword","related_keywords"],"properties":{"exact_keyword":{"type":"array","items":{"type":"object","required":["keyword","monthlysearch","difficulty","competition_score","annotation","cpc","historic_data"],"properties":{"keyword":{"type":"string"},"monthlysearch":{"type":"number"},"difficulty":{"type":"string"},"competition_score":{"type":"number"},"annotation":{"type":"string"},"cpc":{"type":"number"},"historic_data":{"type":"array","items":{"type":"object","properties":{"year":{"type":"number"},"month":{"type":"number"},"search_volume":{"type":"number"}}}}}}},"related_keywords":{"type":"array","items":{"type":"object","required":["keyword","monthlysearch","difficulty","competition_score","annotation","cpc","historic_data"],"properties":{"keyword":{"type":"string"},"monthlysearch":{"type":"number"},"difficulty":{"type":"string"},"competition_score":{"type":"number"},"annotation":{"type":"string"},"cpc":{"type":"number"},"historic_data":{"type":"array","items":{"type":"object","properties":{"year":{"type":"number"},"month":{"type":"number"},"search_volume":{"type":"number"}}}}}}},"perCountry":{"type":"array","items":{"type":"object","required":["countryId","count","exact_keyword","related_keywords"],"properties":{"countryId":{"type":"string","nullable":true},"count":{"type":"number"},"exact_keyword":{"type":"array","items":{"type":"object","required":["keyword","monthlysearch","difficulty","competition_score","annotation","cpc","historic_data"],"properties":{"keyword":{"type":"string"},"monthlysearch":{"type":"number"},"difficulty":{"type":"string"},"competition_score":{"type":"number"},"annotation":{"type":"string"},"cpc":{"type":"number"},"historic_data":{"type":"array","items":{"type":"object","properties":{"year":{"type":"number"},"month":{"type":"number"},"search_volume":{"type":"number"}}}}}}},"related_keywords":{"type":"array","items":{"type":"object","required":["keyword","monthlysearch","difficulty","competition_score","annotation","cpc","historic_data"],"properties":{"keyword":{"type":"string"},"monthlysearch":{"type":"number"},"difficulty":{"type":"string"},"competition_score":{"type":"number"},"annotation":{"type":"string"},"cpc":{"type":"number"},"historic_data":{"type":"array","items":{"type":"object","properties":{"year":{"type":"number"},"month":{"type":"number"},"search_volume":{"type":"number"}}}}}}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"503":{"description":"Google Ads credentials not configured","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"description":"Google Ads credentials not configured"}}}}}}},"/v3/keywords/suggest-keywords":{"get":{"summary":"AI-powered keyword suggestions","tags":["keywords"],"description":"Generates 10 high-value SEO keywords for a brand. If `description` is not supplied, the route crawls the website for context.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string","format":"uri"},"in":"query","name":"website","required":true,"description":"Brand website URL (used for context crawl if no description given)"},{"schema":{"type":"string"},"in":"query","name":"description","required":false,"description":"Brand description that replaces a crawl when provided"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"targetAudience","required":false,"description":"Target audience segments"}],"x-mcp":{"name":"suggest_keywords"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["keywords"],"properties":{"keywords":{"type":"array","items":{"type":"string"},"description":"Suggested SEO keyword list (max 10 items)"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/mcp/teams":{"get":{"summary":"List teams available to the MCP user","tags":["MCP"],"description":"List the brands/teams the authenticated user can access. ALWAYS call this first to obtain a `teamId` for any team-scoped tool: show the user the teams and let them pick the brand by name, then pass that `teamId`. Never ask the user to find, paste, or guess a raw team ID.","x-mcp":{"name":"list_teams","teamScoped":false},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["teams"],"properties":{"teams":{"type":"array","items":{"type":"object","required":["teamId","name","organizationId","role"],"properties":{"teamId":{"type":"string"},"name":{"type":"string"},"website":{"type":"string","nullable":true},"organizationId":{"type":"string"},"organizationName":{"type":"string"},"role":{"type":"string"},"isArchived":{"type":"boolean"}}}}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/mcp/integrations":{"get":{"summary":"List integrations for a team","tags":["MCP"],"description":"Returns sanitized integration status grouped like the dashboard: CMS & Publishing, Analytics & Performance, and SEO & AI Tools. Use the CMS group publishTargets to choose a provider for publish_article or schedule_article. Secrets and raw provider data are never returned.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true}],"x-mcp":{"name":"list_integrations","teamScoped":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["teamId","groups"],"properties":{"teamId":{"type":"string"},"groups":{"type":"array","items":{"type":"object","required":["key","label","integrations","publishTargets"],"properties":{"key":{"type":"string","enum":["cms-publishing","analytics-performance","seo-ai-tools","other"]},"label":{"type":"string"},"integrations":{"type":"array","items":{"type":"object","required":["id","teamId","provider","label","category","isActive","canPublish","canSchedule","connectedAt","createdAt","updatedAt","details"],"properties":{"id":{"type":"string"},"teamId":{"type":"string"},"provider":{"type":"string"},"label":{"type":"string"},"category":{"type":"string","enum":["cms","seo","analytics","performance","indexing","other"]},"isActive":{"type":"boolean"},"canPublish":{"type":"boolean"},"canSchedule":{"type":"boolean"},"connectedAt":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"details":{"type":"object","additionalProperties":true}}}},"publishTargets":{"type":"array","items":{"type":"object","required":["provider","label"],"properties":{"provider":{"type":"string"},"label":{"type":"string"}}}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/newsletter/subscribe":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/next-steps/":{"get":{"operationId":"listNextSteps","summary":"List Next Steps","tags":["Next Steps"],"description":"Returns a team's recommended steps. Defaults to the open list (status open/doing) ordered by priority. Pass wins=true for resolved steps, or subjectType/subjectId to filter to a subject.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"integer","minimum":1,"maximum":50},"in":"query","name":"limit","required":false},{"schema":{"type":"string","enum":["team","keyword","topic","article","page","prompt","domain"]},"in":"query","name":"subjectType","required":false},{"schema":{"type":"string"},"in":"query","name":"subjectId","required":false},{"schema":{"type":"string","enum":["true","false"]},"in":"query","name":"wins","required":false,"description":"When 'true', returns resolved (completed) steps."}],"x-mcp":{"name":"next_steps"},"responses":{"200":{"description":"Default Response"}}},"post":{"operationId":"createNextStep","summary":"Add a Next Step","tags":["Next Steps"],"description":"Adds a task the user wrote themselves to the team's Next Steps board. It sits alongside SnowSEO's suggestions and is never changed, completed, or removed by a refresh.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"teamId":{"type":"string"},"title":{"type":"string","minLength":1,"maxLength":200,"description":"What needs doing, in one line."},"notes":{"type":"string","maxLength":2000,"nullable":true,"description":"Optional detail: why it matters, or how to do it."},"category":{"type":"string","enum":["rankings","technical","content","articles","aiVisibility","authority"],"description":"Which part of the work this belongs to."},"link":{"type":"string","maxLength":2048,"nullable":true,"description":"Optional link to open with the task: an in-app path or an http(s) URL."},"priority":{"type":"string","enum":["now","next","later"],"description":"How urgent it is (defaults to next)."}}}}}},"x-mcp":{"name":"next_steps_create"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/next-steps/bulk":{"post":{"operationId":"createNextSteps","summary":"Add several Next Steps","tags":["Next Steps"],"description":"Adds up to 5 tasks to the team's Next Steps board in one call. Use this to turn the actions you just recommended into work the user can track, instead of leaving them in the chat: one call, one confirmation, most important first. A task that repeats something already on the board is skipped automatically, so there is no need to read the list first and it is safe to run again after the same analysis. Returns what was added and what was skipped, with the reason for each - tell the user both.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["tasks"],"properties":{"teamId":{"type":"string"},"tasks":{"type":"array","minItems":1,"maxItems":5,"description":"The tasks to add, most important first. Give each one a title that says what to do, and notes carrying the evidence behind it.","items":{"type":"object","required":["title"],"properties":{"title":{"type":"string","minLength":1,"maxLength":200,"description":"What needs doing, in one line."},"notes":{"type":"string","maxLength":2000,"nullable":true,"description":"Optional detail: why it matters, or how to do it."},"category":{"type":"string","enum":["rankings","technical","content","articles","aiVisibility","authority"],"description":"Which part of the work this belongs to."},"link":{"type":"string","maxLength":2048,"nullable":true,"description":"Optional link to open with the task: an in-app path or an http(s) URL."},"priority":{"type":"string","enum":["now","next","later"],"description":"How urgent it is (defaults to next)."}}}}}}}}},"x-mcp":{"name":"next_steps_create_many"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/next-steps/{id}":{"patch":{"operationId":"updateNextStep","summary":"Edit a Next Step","tags":["Next Steps"],"description":"Edits a task the user added themselves: its title, notes, category, or link. Only the fields sent are changed; send null for notes or link to clear them. SnowSEO's own suggestions cannot be edited and return 404. Use the priority endpoint to change how urgent it is.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"title":{"type":"string","minLength":1,"maxLength":200,"description":"What needs doing, in one line."},"notes":{"type":"string","maxLength":2000,"nullable":true,"description":"Optional detail: why it matters, or how to do it."},"category":{"type":"string","enum":["rankings","technical","content","articles","aiVisibility","authority"],"description":"Which part of the work this belongs to."},"link":{"type":"string","maxLength":2048,"nullable":true,"description":"Optional link to open with the task: an in-app path or an http(s) URL."}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Next Step ID"}],"x-mcp":{"name":"next_steps_update"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"get":{"operationId":"getNextStepDetail","summary":"Get Next Step fix detail","tags":["Next Steps"],"description":"Returns how to fix a step: the fix steps, best practices, expected impact, and suggested AI prompts. Empty for steps that have no associated fix.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Next Step ID"}],"x-mcp":{"name":"next_steps_detail"},"responses":{"200":{"description":"Default Response"}}}},"/v3/next-steps/{id}/mark-done":{"post":{"operationId":"markNextStepDone","summary":"Mark a Next Step done","tags":["Next Steps"],"description":"Marks a recommended step as done. Only an open or in-progress step can be marked done; already resolved, dismissed, or snoozed steps return 404.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Next Step ID"}],"x-mcp":{"name":"next_steps_mark_done"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/next-steps/{id}/dismiss":{"post":{"operationId":"dismissNextStep","summary":"Dismiss a Next Step","tags":["Next Steps"],"description":"Dismisses a recommended step so it no longer appears in the list. Only an open, in-progress, or snoozed step can be dismissed; already-resolved or dismissed steps return 404.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Next Step ID"}],"x-mcp":{"name":"next_steps_dismiss"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/next-steps/{id}/topics/{topicId}/dismiss":{"post":{"operationId":"dismissNextStepTopic","summary":"Dismiss one topic from a grouped Next Step","tags":["Next Steps"],"description":"Removes a single topic from a grouped (rolled-up) recommendation so it no longer appears inside that card, now or after future refreshes. Other topics in the card are unaffected.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Next Step ID (the grouped card)"},{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Topic ID to remove from the card"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/next-steps/{id}/snooze":{"post":{"operationId":"snoozeNextStep","summary":"Snooze a Next Step","tags":["Next Steps"],"description":"Hides a recommended step for a number of days, after which it returns to the list automatically. Only an open or in-progress step can be snoozed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"days":{"type":"integer","minimum":1,"maximum":90,"description":"Snooze duration in days (default 7)."}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Next Step ID"}],"x-mcp":{"name":"next_steps_snooze"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/next-steps/{id}/start":{"post":{"operationId":"startNextStep","summary":"Start a Next Step","tags":["Next Steps"],"description":"Moves a recommended step into the in-progress state. Accepts an open, snoozed, or already-resolved step, clearing any snooze or resolution.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Next Step ID"}],"x-mcp":{"name":"next_steps_start"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/next-steps/{id}/reopen":{"post":{"operationId":"reopenNextStep","summary":"Reopen a Next Step","tags":["Next Steps"],"description":"Returns an in-progress, snoozed, or resolved step to the open to-do list, clearing any snooze or resolution.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Next Step ID"}],"x-mcp":{"name":"next_steps_reopen"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"},"status":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/next-steps/{id}/priority":{"patch":{"operationId":"updateNextStepPriority","summary":"Update a Next Step priority","tags":["Next Steps"],"description":"Sets a user priority override for a Next Step. Pass priority=null to restore SnowSEO's suggested priority.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["priority"],"properties":{"teamId":{"type":"string"},"priority":{"type":"string","enum":["none","later","next","now"],"nullable":true}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Next Step ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ok","priority","suggestedPriority","priorityOverridden"],"properties":{"ok":{"type":"boolean"},"priority":{"type":"string","enum":["none","later","next","now"]},"suggestedPriority":{"type":"string","enum":["later","next","now"]},"priorityOverridden":{"type":"boolean"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/next-steps/settings":{"get":{"operationId":"getNextStepsSettings","summary":"Get Next Steps settings","tags":["Next Steps"],"description":"Returns the team's Next Steps refresh preferences: the default engine and whether the daily automatic refresh is on.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false}],"x-mcp":{"name":"next_steps_settings"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["defaultEngine","autoSuggestions"],"properties":{"defaultEngine":{"type":"string","enum":["data","ai"]},"autoSuggestions":{"type":"boolean"}}}}}}}},"patch":{"operationId":"updateNextStepsSettings","summary":"Update Next Steps settings","tags":["Next Steps"],"description":"Sets the default refresh engine and/or turns the daily automatic refresh on or off. Only the fields you send are changed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"defaultEngine":{"type":"string","enum":["data","ai"]},"autoSuggestions":{"type":"boolean"}}}}}},"x-mcp":{"name":"next_steps_update_settings"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["defaultEngine","autoSuggestions"],"properties":{"defaultEngine":{"type":"string","enum":["data","ai"]},"autoSuggestions":{"type":"boolean"}}}}}}}}},"/v3/next-steps/refresh":{"post":{"operationId":"refreshNextSteps","summary":"Refresh Next Steps","tags":["Next Steps"],"description":"Recomputes the team's recommended steps from the latest data. Runs in the background and is rate-limited per team; the updated list appears shortly after. Pass engine=\"ai\" to also run the cross-source AI synthesis pass, which costs AI credits; omitting it uses the team's saved default.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"engine":{"type":"string","enum":["data","ai"]}}}}}},"x-mcp":{"name":"next_steps_refresh"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean"},"enqueued":{"type":"boolean"},"jobId":{"type":"string"},"engine":{"type":"string"}}}}}}}}},"/v3/notes/":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/notes/{id}":{"put":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/notifications/":{"get":{"summary":"List notifications","tags":["notifications"],"description":"Returns the current user's notifications for their active team (plus org-wide and global broadcasts), newest first, with the unread (unseen) count and a cursor for pagination.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Active team id"},{"schema":{"type":"string"},"in":"query","name":"limit","required":false,"description":"Page size (1–50, default 20)"},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false,"description":"Opaque keyset cursor (`nextCursor`) from the previous page"},{"schema":{"type":"string"},"in":"query","name":"unread","required":false,"description":"When 'true', only unread notifications"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"notifications":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"scope":{"type":"string","enum":["global","org","team","user"]},"type":{"type":"string","enum":["info","success","warning","error"]},"title":{"type":"string"},"body":{"type":"string","nullable":true,"description":"Markdown (GFM)"},"actionUrl":{"type":"string","nullable":true},"actionLabel":{"type":"string","nullable":true},"authorName":{"type":"string","nullable":true},"authorImageUrl":{"type":"string","nullable":true},"authorRole":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"readAt":{"type":"string","nullable":true,"format":"date-time","description":"When the user saw it (null = unseen)"}}}},"unreadCount":{"type":"integer"},"nextCursor":{"type":"string","nullable":true,"description":"Opaque cursor for the next page, or null at the end"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/notifications/read":{"post":{"summary":"Mark specific notifications seen","tags":["notifications"],"description":"Marks the given notification ids as seen for the current user (used for in-view / per-item read tracking). Idempotent.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ids"],"properties":{"ids":{"type":"array","items":{"type":"string"},"description":"Notification ids to mark seen"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Active team id"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"count":{"type":"integer","description":"How many were newly marked"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/notifications/read-all":{"post":{"summary":"Mark all notifications seen","tags":["notifications"],"description":"Marks every notification currently visible to the user as seen, clearing the unread count. Idempotent.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Active team id"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"count":{"type":"integer","description":"How many were marked seen"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/offers/":{"get":{"operationId":"getActiveOffers","summary":"Get the live offers the signed-in user has not dismissed","tags":["Offers"],"description":"Returns every published offer inside its window that this user has not dismissed, newest first. Bodies ride along: offers are short and few, so opening the card costs no further request.","responses":{"200":{"description":"Live, undismissed offers for this user.","content":{"application/json":{"schema":{"description":"Live, undismissed offers for this user.","type":"object","properties":{"offers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["manual","review"]},"description":{"type":"string"},"preview":{"type":"string"},"ctaLabel":{"type":"string","nullable":true},"ctaUrl":{"type":"string","nullable":true},"rewardCredits":{"type":"number","nullable":true},"endsAt":{"type":"string","nullable":true}},"required":["id","title","type","description","preview","ctaLabel","ctaUrl","rewardCredits","endsAt"]}}},"required":["offers"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"description":"Not signed in.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Server error while loading.","content":{"application/json":{"schema":{"description":"Server error while loading.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/offers/dismiss":{"post":{"operationId":"dismissOffer","summary":"Dismiss an offer card","tags":["Offers"],"description":"Hides the offer for the signed-in user for good, which is what uncovers the changelog card sitting behind it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["offerId"],"properties":{"offerId":{"type":"string","minLength":1,"maxLength":64}}}}}},"responses":{"200":{"description":"The dismissal was recorded.","content":{"application/json":{"schema":{"description":"The dismissal was recorded.","type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"description":"Not signed in.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"404":{"description":"No such offer.","content":{"application/json":{"schema":{"description":"No such offer.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Server error while saving.","content":{"application/json":{"schema":{"description":"Server error while saving.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/offers/review":{"post":{"operationId":"submitOfferReview","summary":"Submit a rating and review for a review offer","tags":["Offers"],"description":"Stores the rating and the written review, dismisses the offer for this user, and answers with where they are being sent. Five-star reviews whose words agree with the rating come back with a listing to post on; everything else is kept internally for the team to work through. A five-star review needs 100 characters; anything below it needs 100 words.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["offerId","rating","message"],"properties":{"offerId":{"type":"string","minLength":1,"maxLength":64},"rating":{"type":"integer","minimum":1,"maximum":5},"message":{"type":"string","minLength":100,"maxLength":4000}}}}}},"responses":{"200":{"description":"The submission was stored.","content":{"application/json":{"schema":{"description":"The submission was stored.","type":"object","properties":{"success":{"type":"boolean"},"submissionId":{"type":"string"},"route":{"type":"string","enum":["public","internal"]},"platform":{"type":"string","enum":["g2","capterra","trustpilot","appsumo"],"nullable":true},"platformUrl":{"type":"string","nullable":true}},"required":["success","submissionId","route","platform","platformUrl"]}}}},"400":{"description":"The submission was rejected.","content":{"application/json":{"schema":{"description":"The submission was rejected.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"description":"Not signed in.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Server error while saving.","content":{"application/json":{"schema":{"description":"Server error while saving.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/offers/review/platform":{"post":{"operationId":"reportOfferReviewPlatform","summary":"Record that a reviewer opened the listing they were given","tags":["Offers"],"description":"Moves the submission into the waiting state so the team can tell someone mid-post from someone who never used the link.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["submissionId","platform"],"properties":{"submissionId":{"type":"string","minLength":1,"maxLength":64},"platform":{"type":"string","enum":["g2","capterra","trustpilot","appsumo"]}}}}}},"responses":{"200":{"description":"Recorded, or already past this point.","content":{"application/json":{"schema":{"description":"Recorded, or already past this point.","type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"401":{"description":"Not signed in.","content":{"application/json":{"schema":{"description":"Not signed in.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"500":{"description":"Server error while saving.","content":{"application/json":{"schema":{"description":"Server error while saving.","type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/v3/onboarding/authority-map":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/generate-description":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/generate-target-audience":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/intermediate-results":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/region-search":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/suggest-competitors":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/suggest-questions":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/suggest-topics":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/verify-brand":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/post-onboarding/status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/post-onboarding/initiate":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/post-onboarding/calendar":{"get":{"operationId":"listContentPlannerItems","summary":"List content planner items","tags":["Onboarding"],"description":"List scheduled/planned content-calendar items for a team (upcoming article slots that haven't generated yet). Optionally windowed to a date range. Items with no scheduled date are always included, since they belong to no window.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"ISO date; inclusive start of the visible window. Unscheduled (null-date) items are returned regardless."},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"ISO date; inclusive end of the visible window. Unscheduled (null-date) items are returned regardless."},{"schema":{"type":"boolean"},"in":"query","name":"unscheduledOnly","required":false,"description":"Return ONLY items with no scheduled date (the unscheduled backlog). Ignores startDate/endDate."}],"x-mcp":{"name":"list_content_planner_items"},"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/post-onboarding/save-content-calendar":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/post-onboarding/survey":{"patch":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/post-onboarding/content-planner/{slug}":{"patch":{"operationId":"updateContentPlannerItem","summary":"Update a content planner item","tags":["Onboarding"],"description":"Update a planned (not-yet-generated) content-calendar item's title, scheduled date, or target CMS.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"title":{"type":"string"},"scheduledAt":{"type":"string","format":"date-time"},"targetCms":{"type":"string","nullable":true}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"x-mcp":{"name":"update_content_planner_item"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/onboarding/post-onboarding/content-planner/{slug}/schedule":{"delete":{"operationId":"unscheduleContentPlannerItem","summary":"Unschedule a content planner item","tags":["Onboarding"],"description":"Clear the scheduled date and target CMS from a planned (not-yet-generated) content-calendar item, without deleting it.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"x-mcp":{"name":"unschedule_content_planner_item"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/onboarding/post-onboarding/content-planner/from-topic-map":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/post-onboarding/content-planner/{slug}/generate-now":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"slug","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/post-onboarding/content-planner/generate-next-30-days":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/post-onboarding/content-planner/generate-next-30-days/status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/user/recover":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/user/status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/user/partial-save":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/user/final-save":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/user/complete-with-plan":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/onboarding/user/geo-audit-public-visibility":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/add-member-to-team":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/agency-toggle":{"get":{"responses":{"200":{"description":"Default Response"}}},"patch":{"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/check-slug":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/{teamId}/archive":{"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"teamId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/{invitationId}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"invitationId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/logo":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/{memberId}/role":{"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"memberId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/portfolio":{"get":{"summary":"Organization brands overview","tags":["Organization"],"description":"Per-brand portfolio overview for one of the user's organizations: AI visibility (value, delta, sparkline), domain rating, open next-steps count, tracked prompts and keywords, and Search/Traffic — plus org KPIs (time saved, articles created, reports sent, active brands). Reads the persisted daily snapshot. Pass organizationId (from list_teams) to target a specific org; omit it when the user belongs to a single org.","parameters":[{"schema":{"type":"string"},"in":"query","name":"organizationId","required":false,"description":"Organization ID (from list_teams). Optional when the user belongs to a single org."},{"schema":{"type":"string"},"in":"query","name":"start","required":false,"description":"Window start date (YYYY-MM-DD, UTC). Defaults to 30 days before end."},{"schema":{"type":"string"},"in":"query","name":"end","required":false,"description":"Window end date (YYYY-MM-DD, UTC). Defaults to today."}],"x-mcp":{"name":"brands_overview","teamScoped":false},"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/portfolio/refresh":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/{memberId}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"memberId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/teams-with-members":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/organization/invitations/{invitationId}/validate-cancel":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"invitationId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/run":{"post":{"operationId":"runPageSpeed","summary":"Run a PageSpeed audit","tags":["PageSpeed"],"description":"Measures pages with Google PageSpeed Insights and stores the results. SPENDS the team's PageSpeed quota — confirm with the user before running, especially with allPages, which audits the entire site. Runs in the background; poll the returned job. Omit both url and targets with allPages=true to re-audit everything.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["auditId"],"properties":{"teamId":{"type":"string","description":"SnowSEO team ID. Call list_teams first to choose a team."},"auditId":{"type":"string","description":"SEO audit ID for this team's site."},"url":{"type":"string","description":"Single page URL to audit. Ignored when allPages is true."},"allPages":{"type":"boolean","default":false,"description":"Audit every page of the site. Expensive — this can consume a large share of the team's PageSpeed quota."},"force":{"type":"boolean","default":false,"description":"Re-audit even if the stored result is still fresh."}}}}}},"x-mcp":{"name":"run_page_speed","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/active-job":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/job-status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/issue-details":{"get":{"operationId":"getPageSpeedIssueDetails","summary":"Get the resources behind one PageSpeed issue on a page","tags":["PageSpeed"],"description":"The item-level detail for a single Lighthouse check on a single page: exactly which images, scripts, stylesheets or requests are at fault, each with its own wasted bytes or milliseconds. This is the 'what do I actually change' layer. Use page_speed_issues first to find the check and which pages it affects (affectedUrls), then call this per page. Read-only.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"url","required":true,"description":"Full URL of the page, e.g. https://example.com/pricing. Take it from page_speed_issues.affectedUrls."},{"schema":{"type":"string"},"in":"query","name":"issueId","required":true,"description":"Lighthouse audit id, e.g. 'unused-css-rules' or 'uses-responsive-images'. This is the `id` field on a page_speed_issues row."},{"schema":{"type":"string","enum":["mobile","desktop"],"default":"mobile"},"in":"query","name":"strategy","required":false,"description":"Device profile. Must match the strategy the issue was reported under."}],"x-mcp":{"name":"page_speed_issue_details","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/":{"get":{"operationId":"getPageSpeedResult","summary":"Get one page's PageSpeed result","tags":["PageSpeed"],"description":"The stored PageSpeed result for a single URL: mobile and desktop scores, Core Web Vitals (lab and real-user CrUX data where available), diagnostics, and the full list of passed and failed Lighthouse checks. Use page_speed_scores to find a page worth drilling into. Read-only.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"url","required":true,"description":"Full URL of the page, e.g. https://example.com/pricing."},{"schema":{"type":"string"},"in":"query","name":"auditId","required":false,"description":"Optional SEO audit ID. Results are team-scoped and identical without it."}],"x-mcp":{"name":"page_speed_page","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/issues-summary":{"get":{"operationId":"pageSpeedIssuesSummary","summary":"Get site-wide PageSpeed issues","tags":["PageSpeed"],"description":"Every PageSpeed (Lighthouse) issue found across the team's crawled pages, grouped by check and ordered by impact. Each issue carries how many pages it affects, its severity, and the estimated time or bytes saved by fixing it. Also returns site-wide averaged scores and Core Web Vitals. Use this to answer 'what is slowing my site down' or 'what should I fix first'. Read-only; it never spends PageSpeed quota.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"auditId","required":false,"description":"Optional SEO audit ID. Results are team-scoped and identical without it; omit unless you already have one."},{"schema":{"type":"string","enum":["mobile","desktop"],"default":"mobile"},"in":"query","name":"strategy","required":false,"description":"Which device profile to report on. Mobile is the ranking viewport and is the default."}],"x-mcp":{"name":"page_speed_issues","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/list":{"get":{"operationId":"pageSpeedList","summary":"List PageSpeed scores for every page","tags":["PageSpeed"],"description":"Mobile and desktop PageSpeed scores (performance, accessibility, best practices, SEO) for every page of the team's site, with the time each was measured. Pages that failed to audit are included with the reason instead of scores. Use this to find the slowest pages or to check coverage. Read-only; it never spends PageSpeed quota.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"auditId","required":false,"description":"Optional SEO audit ID. Results are team-scoped and identical without it; omit unless you already have one."}],"x-mcp":{"name":"page_speed_scores","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/site-fix":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/site-fix/revert":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/site-fix/capability":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/page-speed/site-fix/status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/pdf/":{"post":{"summary":"Generate an SEO audit PDF report","tags":["PDF Export"],"description":"Generates a PDF for a page or overview audit and either downloads it, uploads it to R2 (share link), or emails it as an attachment.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action","data"],"properties":{"action":{"type":"string","enum":["download","share","email"],"description":"What to do with the generated PDF: stream as download, upload to R2 and return a share URL, or email it to `email`."},"type":{"type":"string","enum":["page","overview","page-speed-page","page-speed-overview","geo","combined"],"default":"page","description":"Which PDF document to render: website-audit page or overview, or PageSpeed page or overview."},"data":{"type":"object","additionalProperties":true,"description":"Payload — shape depends on `type`. Must include `pageUrl` (use the base URL for overview variants)."},"email":{"type":"string","format":"email","description":"Recipient address. Required when `action` is `email`."},"teamId":{"type":"string","description":"Team that owns the audit. Membership is enforced by checkMembership."},"whiteLabel":{"type":"boolean","default":true,"description":"Apply the org's white-label brand mark (when enabled and plan-gated). Pass false to force the SnowSEO mark for this export."}}}}}},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"401":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"reason":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/pdf/jobs":{"post":{"summary":"Queue a PDF export","tags":["PDF Export"],"description":"Stores the export payload, enqueues a render job and returns a job id to poll. Renders SEO-audit and PageSpeed reports alike - `type` selects the document. Async because a large render exceeds the 100s edge timeout.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action","data"],"properties":{"action":{"type":"string","enum":["download","share","email"],"description":"What to do with the rendered PDF. `download` and `share` return a URL from the status endpoint; `email` sends it as an attachment."},"type":{"type":"string","enum":["page","overview","page-speed-page","page-speed-overview","geo","combined"],"default":"page","description":"Which document to render."},"data":{"type":"object","additionalProperties":true,"description":"Payload — shape depends on `type`. Must include `pageUrl` (use the base URL for overview variants)."},"email":{"type":"string","format":"email","description":"Recipient address. Required when `action` is `email`."},"teamId":{"type":"string","description":"Team that owns the audit. Membership is enforced by checkMembership."},"whiteLabel":{"type":"boolean","default":true,"description":"Apply the org's white-label brand mark when entitled."}}}}}},"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"},"status":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"413":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/v3/pdf/share":{"delete":{"summary":"Delete a shared PDF","tags":["PDF Export"],"description":"Deletes the exported PDF behind a share URL, which is what revokes the link. The URL must belong to the caller's team.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"The share URL returned by an export."}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/pdf/jobs/{jobId}":{"get":{"summary":"Check a queued PDF export","tags":["PDF Export"],"description":"Returns the job state, progress and — once complete — the download URL.","parameters":[{"schema":{"type":"string"},"in":"path","name":"jobId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"},"state":{"type":"string"},"progress":{"type":"number"},"url":{"type":"string","nullable":true},"filename":{"type":"string","nullable":true},"bytes":{"type":"number","nullable":true},"renderMs":{"type":"number","nullable":true},"error":{"type":"string","nullable":true}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/public/article-share/{token}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"query","name":"reviewerId","required":false},{"schema":{"type":"string"},"in":"path","name":"token","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"token","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/public/article-share/{token}/submit":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"token","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/public/article-share/{token}/unsubmit":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"token","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/public/geo-audit-result/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/public/report-share/{token}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"token","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/public/sitemap/{teamId}/sitemap.xml":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"teamId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/public/sitemap/{teamId}/{file}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"teamId","required":true},{"schema":{"type":"string"},"in":"path","name":"file","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/rank-tracking/keywords/untrack":{"post":{"summary":"Untrack one or more keywords","tags":["Rank Tracking"],"description":"Remove a keyword from rank tracking by ID or list of IDs.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","anyOf":[{"required":["id"]},{"required":["ids"]}],"properties":{"teamId":{"type":"string","description":"Team ID"},"id":{"type":"string","description":"Single keyword ID to untrack"},"ids":{"type":"array","items":{"type":"string"},"description":"Multiple keyword IDs to untrack"}}}}}},"x-mcp":{"name":"untrack_keywords"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"untracked":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"},"code":{"type":"string"},"busy":{"type":"array","items":{"type":"string"}}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/rank-tracking/keywords/delete":{"post":{"summary":"Delete one or more tracked keywords","tags":["Rank Tracking"],"description":"Permanently delete tracked keyword(s) and their rank history by ID or list of IDs. The shared keyword entity and any topic-cluster membership are left intact. Unlike untrack, this cannot be undone.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","anyOf":[{"required":["id"]},{"required":["ids"]}],"properties":{"teamId":{"type":"string","description":"Team ID"},"id":{"type":"string","description":"Single tracked keyword ID"},"ids":{"type":"array","items":{"type":"string"},"description":"Multiple tracked keyword IDs"}}}}}},"x-mcp":{"name":"delete_keywords"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"deleted":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"},"code":{"type":"string"},"busy":{"type":"array","items":{"type":"string"}}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/rank-tracking/keywords":{"post":{"summary":"Add one or more tracked keywords","tags":["Rank Tracking"],"description":"Track one keyword or a batch of keywords for rank monitoring. Tracking works at country level AND at local level (city, county, state, region, neighbourhood). For country level, set `countryId` to an ISO2 code. For anywhere more specific, call `search_locations` first and pass the result's `criteriaId` as `locationCriteriaId` and its `canonicalName` as `locationCanonicalName` - do not invent either value.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string","description":"Team ID"},"keyword":{"type":"string","minLength":1,"maxLength":255,"description":"Keyword to track"},"countryId":{"type":"string","nullable":true,"description":"Country ID (ISO2) or null for worldwide. Set this alongside a location when targeting a place inside a country."},"languageId":{"type":"string","nullable":true,"description":"Language ID or null for default"},"locationCriteriaId":{"type":"number","nullable":true,"description":"Google Ads location criteria ID for local (sub-country) tracking - city, county, state, region or neighbourhood. Get it from `search_locations`; never guess it. Omit/null for country-only tracking."},"locationCanonicalName":{"type":"string","nullable":true,"description":"Canonical location name from the same `search_locations` row (e.g. \"Palm Beach County,Florida,United States\"). Send it whenever locationCriteriaId is set; if omitted the stored canonical name is null."},"items":{"type":"array","description":"Batch of keywords to track","items":{"type":"object","required":["keyword"],"properties":{"keyword":{"type":"string","minLength":1,"maxLength":255},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true},"locationCriteriaId":{"type":"number","nullable":true},"locationCanonicalName":{"type":"string","nullable":true}}}},"active":{"type":"boolean","description":"Defaults to true. Set false to add the keywords to the team's list WITHOUT tracking them: no SERP allowance is consumed and no crawl is scheduled, and they can be tracked later. Batch (`items`) only."}}}}}},"x-mcp":{"name":"track_keywords"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"requested":{"type":"number"},"alreadyTracked":{"type":"number"},"reactivated":{"type":"number"},"created":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"402":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}},"get":{"summary":"List tracked keywords","tags":["Rank Tracking"],"description":"Returns the list of tracked keywords for a team.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD, UTC) for GSC position summary window."},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD, UTC) for GSC position summary window."},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Days to look back for GSC position summary (legacy fallback)."},{"schema":{"type":"boolean"},"in":"query","name":"includeInactive","required":false,"description":"When true, also returns soft-untracked (active=false) keywords so the UI can offer re-tracking. Defaults to false (active only)."},{"schema":{"type":"string","enum":["minimal","summary"]},"in":"query","name":"fields","required":false,"description":"Set to 'minimal' for a trimmed payload (keyword text + targeting + tracked flags only, no positionHistory/resultHistory). Intended for callers that only check whether a keyword is tracked. Set to 'summary' for everything except resultHistory - keeps positionHistory, so callers that plot a rank trend but never open a SERP snapshot skip the largest part of the payload. Omit for the full response."}],"x-mcp":{"name":"rank_tracking_keywords"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"keywordId":{"type":"string"},"keyword":{"type":"string"},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true},"locationCriteriaId":{"type":"number","nullable":true},"locationCanonicalName":{"type":"string","nullable":true},"position":{"type":"number"},"positionHistory":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"position":{"type":"number"}}}},"active":{"type":"boolean"},"status":{"type":"string","enum":["completed","processing","failed","pending"]},"refreshedAt":{"type":"string","nullable":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"gscPosition":{"type":"number","nullable":true},"gscClicks":{"type":"number","nullable":true},"gscImpressions":{"type":"number","nullable":true},"isTracked":{"type":"boolean"},"trackingId":{"type":"string"},"positionTrend":{"type":"string","nullable":true,"enum":["improved","declined","same","new"]},"nextRunAt":{"type":"string","nullable":true},"resultHistory":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/rank-tracking/keywords/{id}":{"patch":{"summary":"Update a tracked keyword","tags":["Rank Tracking"],"description":"Update properties of a tracked keyword (e.g. country, language, active state).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string","description":"Team ID"},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true},"locationCriteriaId":{"type":"number","nullable":true},"locationCanonicalName":{"type":"string","nullable":true},"keywordId":{"type":"string"},"active":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Tracked keyword ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/rank-tracking/distribution-trend":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/rank-tracking/domain-position-trend":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/rank-tracking/top-keywords":{"get":{"summary":"Top keywords from GSC","tags":["Rank Tracking"],"description":"Returns the top performing keywords from Google Search Console for a team.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD, UTC). Preferred over days."},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD, UTC). Preferred over days."},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Number of days to look back (legacy fallback)"},{"schema":{"type":"string"},"in":"query","name":"device","required":false,"description":"Device filter"},{"schema":{"type":"string"},"in":"query","name":"type","required":false,"description":"Search type filter"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"type":"string","enum":["all","ranked","tracked"]},"in":"query","name":"scope","required":false,"description":"Keyword universe: all (GSC + tracked merged), ranked (GSC only), tracked (tracked only). Defaults to all."},{"schema":{"type":"integer"},"in":"query","name":"limit","required":false,"description":"Max results"},{"schema":{"type":"string"},"in":"query","name":"includeComparison","required":false,"description":"Include period-over-period comparison"},{"schema":{"type":"integer"},"in":"query","name":"currentPeriodDays","required":false,"description":"Days in current period (legacy fallback)"},{"schema":{"type":"integer"},"in":"query","name":"previousPeriodDays","required":false,"description":"Days in previous period (legacy fallback)"}],"x-mcp":{"name":"rank_tracking_top_keywords"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"keyword":{"type":"string"},"clicks":{"type":"number","nullable":true},"impressions":{"type":"number","nullable":true},"ctr":{"type":"number","nullable":true},"position":{"type":"number"},"isStarred":{"type":"boolean"},"languageId":{"type":"string"},"clicksChange":{"type":"number"},"impressionsChange":{"type":"number"},"ctrChange":{"type":"number"},"positionChange":{"type":"number"},"pages":{"type":"number"},"rankedPages":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"page":{"type":"string"},"clicks":{"type":"number"},"impressions":{"type":"number"},"ctr":{"type":"number"},"position":{"type":"number"},"clicksChange":{"type":"number"},"impressionsChange":{"type":"number"},"ctrChange":{"type":"number"},"positionChange":{"type":"number"}}}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/rank-tracking/keyword-changes":{"get":{"summary":"Keyword performance changes","tags":["Rank Tracking"],"description":"Returns rising, falling, new, and lost keywords by comparing average position across two time periods.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD, UTC)"},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD, UTC)"},{"schema":{"type":"integer"},"in":"query","name":"limit","required":false,"description":"Max results per category"},{"schema":{"type":"string"},"in":"query","name":"device","required":false,"description":"Device filter"},{"schema":{"type":"string"},"in":"query","name":"type","required":false,"description":"Search type filter"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"},{"schema":{"type":"string","enum":["all","ranked","tracked"]},"in":"query","name":"scope","required":false,"description":"Keyword universe: all (GSC + tracked), ranked (GSC only), tracked (tracked only). Defaults to all."}],"x-mcp":{"name":"rank_tracking_keyword_changes"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"rising":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string"},"clicks":{"type":"number","nullable":true},"impressions":{"type":"number","nullable":true},"position":{"type":"number"},"clicksChange":{"type":"number"},"impressionsChange":{"type":"number"},"positionChange":{"type":"number"},"previousPosition":{"type":"number"},"previousClicks":{"type":"number"},"previousImpressions":{"type":"number"},"category":{"type":"string","enum":["rising","falling","new","lost"]},"pages":{"type":"number"},"rankedPages":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"page":{"type":"string"},"clicks":{"type":"number"},"impressions":{"type":"number"},"ctr":{"type":"number"},"position":{"type":"number"},"clicksChange":{"type":"number"},"impressionsChange":{"type":"number"},"ctrChange":{"type":"number"},"positionChange":{"type":"number"}}}}}}},"falling":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string"},"clicks":{"type":"number","nullable":true},"impressions":{"type":"number","nullable":true},"position":{"type":"number"},"clicksChange":{"type":"number"},"impressionsChange":{"type":"number"},"positionChange":{"type":"number"},"previousPosition":{"type":"number"},"previousClicks":{"type":"number"},"previousImpressions":{"type":"number"},"category":{"type":"string","enum":["rising","falling","new","lost"]},"pages":{"type":"number"},"rankedPages":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"page":{"type":"string"},"clicks":{"type":"number"},"impressions":{"type":"number"},"ctr":{"type":"number"},"position":{"type":"number"},"clicksChange":{"type":"number"},"impressionsChange":{"type":"number"},"ctrChange":{"type":"number"},"positionChange":{"type":"number"}}}}}}},"new":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string"},"clicks":{"type":"number","nullable":true},"impressions":{"type":"number","nullable":true},"position":{"type":"number"},"clicksChange":{"type":"number"},"impressionsChange":{"type":"number"},"positionChange":{"type":"number"},"previousPosition":{"type":"number"},"previousClicks":{"type":"number"},"previousImpressions":{"type":"number"},"category":{"type":"string","enum":["rising","falling","new","lost"]},"pages":{"type":"number"},"rankedPages":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"page":{"type":"string"},"clicks":{"type":"number"},"impressions":{"type":"number"},"ctr":{"type":"number"},"position":{"type":"number"},"clicksChange":{"type":"number"},"impressionsChange":{"type":"number"},"ctrChange":{"type":"number"},"positionChange":{"type":"number"}}}}}}},"lost":{"type":"array","items":{"type":"object","properties":{"keyword":{"type":"string"},"clicks":{"type":"number","nullable":true},"impressions":{"type":"number","nullable":true},"position":{"type":"number"},"clicksChange":{"type":"number"},"impressionsChange":{"type":"number"},"positionChange":{"type":"number"},"previousPosition":{"type":"number"},"previousClicks":{"type":"number"},"previousImpressions":{"type":"number"},"category":{"type":"string","enum":["rising","falling","new","lost"]},"pages":{"type":"number"},"rankedPages":{"type":"array","items":{"type":"object","additionalProperties":true,"properties":{"page":{"type":"string"},"clicks":{"type":"number"},"impressions":{"type":"number"},"ctr":{"type":"number"},"position":{"type":"number"},"clicksChange":{"type":"number"},"impressionsChange":{"type":"number"},"ctrChange":{"type":"number"},"positionChange":{"type":"number"}}}}}}},"categories":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"count":{"type":"number"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/rank-tracking/keyword-history":{"get":{"summary":"Keyword position history","tags":["Rank Tracking"],"description":"Returns the position history for a specific keyword from GSC or internal tracking.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"keyword","required":false,"description":"Keyword to get history for"},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Start date (YYYY-MM-DD, UTC). Preferred over days."},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"End date (YYYY-MM-DD, UTC). Preferred over days."},{"schema":{"type":"integer"},"in":"query","name":"days","required":false,"description":"Number of days to look back (legacy fallback)"},{"schema":{"type":"string"},"in":"query","name":"country","required":false,"description":"Country filter"}],"x-mcp":{"name":"rank_tracking_keyword_history"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string"},"position":{"type":"number"},"clicks":{"type":"number"},"impressions":{"type":"number"},"source":{"type":"string","enum":["internal","gsc"]}}}},"source":{"type":"string","enum":["internal","gsc"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/region-search/canonical-cities":{"get":{"operationId":"canonicalCitySearch","summary":"Search locations for local rank tracking (city/county/region/country)","tags":["Utilities"],"description":"Resolves a place name to the `criteriaId` + `canonicalName` that `track_keywords` needs for local (sub-country) rank tracking. Call this FIRST whenever the user names anywhere more specific than a country - a city, county, state, province, borough or neighbourhood - then pass the chosen row's `criteriaId` as `locationCriteriaId` and its `canonicalName` as `locationCanonicalName`. Never guess a criteriaId: they are Google Ads geo-target IDs and an invented one will not resolve. Search terms are comma-separated and ANDed (e.g. \"palm beach,county\"). Use `targetTypes=Country` for country-level lookups, or `excludeTargetTypes=Country,Postal Code` to search only sub-country places. Country-only tracking needs no lookup - pass ISO2 as `countryId`.","parameters":[{"schema":{"type":"string"},"in":"query","name":"q","required":false,"description":"Comma-separated search terms (e.g. \"Austin\"). Empty → alphabetical default page."},{"schema":{"type":"string"},"in":"query","name":"targetTypes","required":false,"description":"Comma-separated target_type filter (e.g. \"City\")."},{"schema":{"type":"string"},"in":"query","name":"excludeTargetTypes","required":false,"description":"Comma-separated target_type exclude filter (e.g. \"Country\")."},{"schema":{"type":"integer"},"in":"query","name":"limit","required":false,"description":"Page size (default 75, max 100)."},{"schema":{"type":"integer"},"in":"query","name":"offset","required":false,"description":"Row offset for paging (default 0)."}],"x-mcp":{"name":"search_locations"},"responses":{"200":{"description":"Up to 75 matching geo-targets.","content":{"application/json":{"schema":{"description":"Up to 75 matching geo-targets.","type":"array","items":{"type":"object","required":["criteriaId","name","canonicalName","parentId","countryCode","targetType"],"properties":{"criteriaId":{"type":"number"},"name":{"type":"string"},"canonicalName":{"type":"string"},"parentId":{"type":"number","nullable":true},"countryCode":{"type":"string"},"targetType":{"type":"string"}}}}}}},"400":{"description":"Bad request (missing or empty q parameter).","content":{"application/json":{"schema":{"description":"Bad request (missing or empty q parameter).","type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Canonical city search failed.","content":{"application/json":{"schema":{"description":"Canonical city search failed.","type":"object","properties":{"error":{"type":"string"}}}}}},"503":{"description":"Region database not configured.","content":{"application/json":{"schema":{"description":"Region database not configured.","type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/reports/":{"get":{"responses":{"200":{"description":"Default Response"}}},"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/reports/templates":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/reports/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/reports/{id}/share":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/reports/{id}/share/email":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/reports/{id}/share/link":{"post":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/reports/share/{token}":{"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"token","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/reports/edit/":{"post":{"summary":"Edit an existing report layout from a natural-language prompt","tags":["reports"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt","content"],"properties":{"teamId":{"type":"string"},"prompt":{"type":"string"},"content":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/reports/generate/":{"post":{"summary":"Generate a report layout from a natural-language prompt","tags":["reports"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt"],"properties":{"teamId":{"type":"string"},"prompt":{"type":"string"},"orientation":{"type":"string","enum":["portrait","landscape"]},"language":{"type":"string"},"theme":{"type":"object","additionalProperties":true},"dateRange":{"type":"object","additionalProperties":true},"comparison":{"type":"object","additionalProperties":true},"meta":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/reports/translations/":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/repurpose-content/":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/resolve-media-placeholders/":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/robots/":{"get":{"operationId":"getRobotsTxt","summary":"Read the site's robots.txt and what it blocks","tags":["Robots"],"description":"The rules declared in the site's robots.txt, the sitemaps it points to, and how many of the site's known pages a given crawler is allowed to fetch. Use this to find out why pages are not being crawled or indexed.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."}],"x-mcp":{"name":"robots_txt","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/rss-settings/":{"get":{"responses":{"200":{"description":"Default Response"}}},"patch":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"enabled":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/seo-audit/":{"get":{"summary":"Perform a comprehensive SEO audit on a website","tags":["SEO Audit"],"description":"Crawls a URL with Firecrawl (Crawl4AI fallback), performs a multi-category SEO audit (Common SEO Issues, Server & Security, Mobile Usability, Advanced SEO), and returns structured results with scores per category. In `multiple` mode (deep crawl) with `async=true`, the route returns 200 immediately and saves results to the database in the background. The route accepts both GET (params in querystring) and POST (params in JSON body).","parameters":[{"schema":{"type":"string"},"in":"query","name":"url","required":true,"description":"URL to audit (https:// prefixed automatically)"},{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID (required for async multiple mode)"},{"schema":{"type":"string","enum":["single","multiple"],"default":"single"},"in":"query","name":"auditType","required":false,"description":"Audit mode: single page or deep multi-page crawl"},{"schema":{"type":"string","enum":["true","false"],"default":"true"},"in":"query","name":"async","required":false,"description":"Enable async background processing (multiple mode only)"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"includeTags","required":false,"description":"HTML tags to include during crawl"},{"schema":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]},"in":"query","name":"excludeTags","required":false,"description":"HTML tags to exclude during crawl"}],"responses":{"200":{"description":"Union of single-page, preview, async multiple, and sync multiple shapes. additionalProperties is required so fast-json-stringify does not strip nested audit fields.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Union of single-page, preview, async multiple, and sync multiple shapes. additionalProperties is required so fast-json-stringify does not strip nested audit fields.","properties":{"url":{"type":"string"},"title":{"type":"string"},"suggestedBrand":{"type":"string"},"seoAudit":{"type":"object","additionalProperties":true},"screenshot":{"type":"string","nullable":true},"success":{"type":"boolean"},"message":{"type":"string"},"totalPages":{"type":"number"},"results":{"type":"array","nullable":true,"items":{"type":"object","additionalProperties":true,"properties":{"url":{"type":"string"},"score":{"type":"number"},"data":{"type":"object","additionalProperties":true}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"post":{"summary":"Perform a comprehensive SEO audit on a website","tags":["SEO Audit"],"description":"Crawls a URL with Firecrawl (Crawl4AI fallback), performs a multi-category SEO audit (Common SEO Issues, Server & Security, Mobile Usability, Advanced SEO), and returns structured results with scores per category. In `multiple` mode (deep crawl) with `async=true`, the route returns 200 immediately and saves results to the database in the background. The route accepts both GET (params in querystring) and POST (params in JSON body).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"url":{"type":"string","description":"URL to audit (https:// prefixed automatically)"},"teamId":{"type":"string","description":"Team ID (required for async multiple mode)"},"auditType":{"type":"string","enum":["single","multiple"],"default":"single","description":"Audit mode: single page or deep multi-page crawl"},"async":{"type":"string","enum":["true","false"],"default":"true","description":"Enable async background processing (multiple mode only)"},"includeTags":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"HTML tags to include during crawl"},"excludeTags":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}],"description":"HTML tags to exclude during crawl"},"urls":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Batch of URLs to audit (alternative to url for Audit Selected). Requires teamId."}}}}}},"responses":{"200":{"description":"Union of single-page, preview, async multiple, and sync multiple shapes. additionalProperties is required so fast-json-stringify does not strip nested audit fields.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"description":"Union of single-page, preview, async multiple, and sync multiple shapes. additionalProperties is required so fast-json-stringify does not strip nested audit fields.","properties":{"url":{"type":"string"},"title":{"type":"string"},"suggestedBrand":{"type":"string"},"seoAudit":{"type":"object","additionalProperties":true},"screenshot":{"type":"string","nullable":true},"success":{"type":"boolean"},"message":{"type":"string"},"totalPages":{"type":"number"},"results":{"type":"array","nullable":true,"items":{"type":"object","additionalProperties":true,"properties":{"url":{"type":"string"},"score":{"type":"number"},"data":{"type":"object","additionalProperties":true}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/v3/seo-audit/active-job":{"get":{"operationId":"getSeoAuditActiveJob","summary":"Check whether an audit is already running","tags":["SEO Audit"],"description":"Whether a crawl or audit is currently in progress for this site, and the job ID to poll if so. Check this before starting a new audit to avoid queueing a duplicate.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"url","required":true,"description":"The site URL being audited."}],"x-mcp":{"name":"seo_audit_active_job","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/seo-audit/job-status":{"get":{"operationId":"getSeoAuditJobStatus","summary":"Get audit job progress","tags":["SEO Audit"],"description":"Progress and outcome of a crawl or audit job started earlier — how far along it is, and whether it succeeded or failed. Get the job ID from seo_audit_active_job.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"jobId","required":true,"description":"Job ID returned by seo_audit_active_job."}],"x-mcp":{"name":"seo_audit_job_status","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/seo-audit/latest-audit/":{"get":{"operationId":"getLatestSeoAudit","summary":"Get the latest SEO audit for a page or site","tags":["SEO Audit"],"description":"The most recent technical SEO audit: overall, technical, content and GEO scores, plus the SEO issues found and whether each has been marked fixed. Each issue also reports `autofixCredits`, the exact credits autofix_issues would charge to fix it on that page (0 when the issue is not auto-fixable or the fix is free). Set pageIssuesScope to 'domain' for site-wide issues across every crawled page, or leave it as 'page' for just the requested URL. Use this to answer 'what SEO problems does my site have' or 'what should I fix'.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"link","required":true,"description":"Full URL of the page to report on, e.g. https://example.com/pricing. Use the site's homepage together with pageIssuesScope='domain' for a site-wide view."},{"schema":{"type":"string","enum":["page","domain"],"default":"page"},"in":"query","name":"pageIssuesScope","required":false,"description":"'page' returns issues for the requested URL only. 'domain' returns issues across every crawled page of the site."},{"schema":{"type":"string","enum":["full","meta"],"default":"full"},"in":"query","name":"fields","required":false,"description":"'meta' returns only the audit's scores and timestamps, with no issues at all. Use it when you just need to know whether an audit exists and how it scored; it skips the issue join and the link-graph work entirely."}],"x-mcp":{"name":"seo_audit","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/seo-audit/audit-issues/{id}/mark-fixed":{"patch":{"operationId":"markPageIssueFixed","summary":"Mark one page's SEO issue fixed","tags":["SEO Audit"],"description":"Marks a single audit-issue row as fixed (or unfixed) for one page. Records the user's judgement only — it does not change the website. Use mark_issue_fixed instead to mark the same issue across every page. Re-auditing can reopen it if still detected.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"markedFixed":{"type":"boolean","default":true,"description":"true marks it fixed, false reopens it. Defaults to true."}}}}}},"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"The audit-issue row ID for this page, as returned by seo_audit."}],"x-mcp":{"name":"mark_page_issue_fixed","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/seo-audit/audit-issues/autofix":{"post":{"operationId":"autofixIssues","summary":"Auto-fix SEO issues on pages","tags":["SEO Audit"],"description":"Applies SnowSEO's automatic fixes for the given issues on the given pages, writing the changes to the connected CMS. This MODIFIES the live site and SPENDS CREDITS - always confirm the pages and issues with the user first, and quote the cost first. Issues from seo_audit and page_speed_issues alike carry an `autofixCredits` field holding the exact credits that fix will charge on that page: image-alt is charged per image so its cost scales with the image count, and most PageSpeed fixes are deterministic and free. Handles both SEO and PageSpeed slugs - only issues with an auto-fixable slug can be fixed, and those two tools report which. Requires the SnowSEO WordPress plugin to be connected - auto-fix is not available on other CMS platforms, and some fixes need a recent plugin version. Runs in the background; poll autofix_status for what actually landed.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId"],"properties":{"teamId":{"type":"string","description":"SnowSEO team ID. Call list_teams first to choose a team."},"pageUrl":{"type":"string","description":"Full URL of a single page to fix, e.g. https://example.com/pricing."},"slugs":{"type":"array","items":{"type":"string"},"description":"SnowSEO issue slugs to fix on that page, as reported by seo_audit or page_speed_issues."},"customInstructions":{"type":"string","description":"Optional guidance applied to every fix in this request, e.g. 'keep the brand name at the end of every title'. It ALSO enables AI for fixes that are normally deterministic, so it can handle cases a rule cannot - for example removing a theme-injected H1 even when the page has only one. Charged per character per page ON TOP of the per-issue cost, so quote the extra to the user before sending it."}}}}}},"x-mcp":{"name":"autofix_issues","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/seo-audit/audit-issues/autofix/status":{"get":{"operationId":"getAutofixStatus","summary":"Check auto-fix progress","tags":["SEO Audit"],"description":"Progress and results of auto-fix jobs started by autofix_issues — which fixes succeeded, which failed, and why. Read-only.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"pageUrl","required":false,"description":"Optional. Limit results to one page URL."},{"schema":{"type":"string"},"in":"query","name":"jobIds","required":false,"description":"Optional comma-separated job IDs returned by autofix_issues."}],"x-mcp":{"name":"autofix_status","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/seo-audit/audit-issues/mark-all-fixed":{"patch":{"operationId":"markIssueFixedEverywhere","summary":"Mark an SEO issue fixed across the site","tags":["SEO Audit"],"description":"Marks one SEO issue as fixed (or unfixed) on every page of the team's site. This only records that the user considers it handled — it does not change the website. Use seo_audit to find the issue ID first. Re-auditing can reopen the issue if it is still detected.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"markedFixed":{"type":"boolean","default":true,"description":"true marks the issue fixed, false reopens it. Defaults to true."}}}}}},"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"issueId","required":true,"description":"The SnowSEO issue ID to mark, as returned by seo_audit."}],"x-mcp":{"name":"mark_issue_fixed","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/seo-audit/crawled-pages/":{"get":{"operationId":"listCrawledPages","summary":"List crawled pages for a site","tags":["SEO Audit"],"description":"Every page SnowSEO has discovered or crawled for this site, with its SEO/technical/content/GEO scores, title, HTTP status, and mobile PageSpeed score where available. Pages excluded by the team's crawl rules are returned and flagged rather than hidden. Use this to see what is indexed in SnowSEO, find low-scoring pages, or check whether a URL was crawled.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"link","required":true,"description":"The site's URL or bare domain, e.g. https://example.com. Returns the whole page inventory for the team, not just this URL."}],"x-mcp":{"name":"crawled_pages","teamScoped":true},"responses":{"200":{"description":"Default Response"}}},"delete":{"responses":{"200":{"description":"Default Response"}}}},"/v3/seo-optimization/optimize-field":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/article-automation/":{"get":{"summary":"Get article automation settings","tags":["Settings"],"description":"Read the team's automated article generation settings (cadence, preferred posting time and timezone, preferred topics/types, image styles, CMS target, auto-update rules).","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"x-mcp":{"name":"article_automation_settings"},"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update article automation settings","tags":["Settings"],"description":"Update the team's article automation settings. All fields optional; only provided fields change. Toggle automation on/off, set postingFrequency (e.g. daily/weekly), preferredPostingTime (a named window - past-midnight/morning/afternoon/evening/night - or an exact 24h \"HH:MM\"), timeZone (IANA zone, e.g. \"Asia/Kolkata\", that posting times resolve against), preferredTopicIds, preferredArticleTypes, content length (short/medium/long), CMS target, image styles, and auto-update rules.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"teamId":{"type":"string"},"automation":{"type":"boolean"},"postingFrequency":{"type":"string"},"preferredPostingTime":{"type":"string"},"timeZone":{"type":"string"},"targetPostStatus":{"type":"string","enum":["draft","published"]},"preferredTopicIds":{"type":"array","items":{"type":"string"}},"preferredArticleTypes":{"type":"array","items":{"type":"string"}},"preferredContentLength":{"type":"string","enum":["short","medium","long"]},"preferredCMSProvider":{"type":"string","nullable":true},"writingLanguage":{"type":"string","nullable":true,"description":"Language code articles are written in (e.g. 'es'). Usually two letters; Chinese is 'zh_CN'/'zh_TW' and Hebrew is 'iw'. Null clears it back to inheriting the brand language. Applies to articles only - keyword research, SERP data and AI-visibility tracking stay on the brand language."},"useHumanizer":{"type":"boolean"},"internalLinkVolume":{"type":"number"},"keepTableOfContents":{"type":"boolean","description":"Keep the generated table of contents when publishing. Default false - most CMS themes render their own, so ours goes out as a duplicate."},"autoUpdateExistingArticles":{"type":"boolean"},"articleUpdateFrequency":{"type":"string"},"articleUpdateMinAgeDays":{"type":"number"}}}}}},"x-mcp":{"name":"update_article_automation"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/article-automation/clusters":{"get":{"summary":"List topic clusters available for automation","tags":["Settings"],"description":"Read the team's topic clusters with keyword counts, selectable as preferred topics for article automation.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"x-mcp":{"name":"article_automation_clusters"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/upload":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/":{"get":{"operationId":"getBrandSettings","summary":"Get brand settings","tags":["Settings"],"description":"Returns the brand/settings for a team.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"x-mcp":{"name":"brand_settings"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"name":{"type":"string"},"website":{"type":"string"},"blogSuffix":{"type":"string","nullable":true},"description":{"type":"string"},"contentGuidelines":{"type":"string"},"screenshots":{"type":"array","items":{"type":"object","additionalProperties":true}},"logo":{"type":"string","nullable":true},"brandColors":{"type":"object","nullable":true,"additionalProperties":true},"websiteChangeAllowed":{"type":"boolean"},"websiteChangeCooldownDays":{"type":"number"},"brandSlug":{"type":"string","nullable":true},"aliases":{"type":"array","items":{"type":"string"}},"onlinePresence":{"type":"object","additionalProperties":true},"whiteLabel":{"type":"object","additionalProperties":true}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}},"patch":{"summary":"Update brand settings","tags":["Settings"],"description":"Update the brand profile: name, website, description, content guidelines, aliases, brand colors, logo, and online-presence links. All fields optional; only provided fields change.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"teamId":{"type":"string"},"name":{"type":"string"},"website":{"type":"string"},"blogSuffix":{"type":"string","nullable":true},"description":{"type":"string"},"contentGuidelines":{"type":"string"},"brandSlug":{"type":"string"},"aliases":{"type":"array","items":{"type":"string"}},"brandColors":{"type":"object","nullable":true,"additionalProperties":true},"logo":{"type":"string","nullable":true},"onlinePresence":{"type":"object","additionalProperties":true}}}}}},"x-mcp":{"name":"update_brand_settings"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/white-label":{"patch":{"summary":"Update white-label report branding","tags":["Settings"],"description":"Update the org's white-label branding for client reports (logo, name, website, accent color, visibility toggles). All fields optional. Requires white-label access (Scale plan / AppSumo tier 3+).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"teamId":{"type":"string"},"enabled":{"type":"boolean"},"logoUrl":{"type":"string","nullable":true},"name":{"type":"string","nullable":true},"website":{"type":"string","nullable":true},"showLogo":{"type":"boolean"},"showName":{"type":"boolean"},"showWebsite":{"type":"boolean"},"accentColor":{"type":"string","nullable":true,"pattern":"^#[0-9a-fA-F]{6}$","description":"Accent colour as a 6-digit hex, including the leading '#', e.g. '#7C3AED'. Shorthand like '#fff' and named colours are rejected. Send null to clear it and fall back to the brand colour."}}}}}},"x-mcp":{"name":"update_white_label"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/smtp":{"get":{"summary":"Get custom SMTP settings","tags":["Settings"],"description":"Read the org's custom SMTP settings (masked — password never returned). Requires white-label access (Scale plan / AppSumo tier 3+).","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"x-mcp":{"name":"smtp_settings"},"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update custom SMTP settings","tags":["Settings"],"description":"Update the org's custom SMTP credentials for client-report delivery. All fields optional. Leave password empty to keep the stored one. Requires white-label access.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"teamId":{"type":"string"},"enabled":{"type":"boolean"},"host":{"type":"string","nullable":true},"port":{"type":"number","nullable":true},"encryption":{"type":"string","enum":["ssl","tls","none"]},"user":{"type":"string","nullable":true},"password":{"type":"string","nullable":true},"fromName":{"type":"string","nullable":true},"fromEmail":{"type":"string","nullable":true},"replyTo":{"type":"string","nullable":true}}}}}},"x-mcp":{"name":"update_smtp_settings"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/smtp/test":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/screenshot":{"patch":{"responses":{"200":{"description":"Default Response"}}},"delete":{"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/screenshots":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/screenshots/{screenshotLabel}":{"patch":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"screenshotLabel","required":true}],"responses":{"200":{"description":"Default Response"}}},"delete":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"screenshotLabel","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/audience":{"get":{"summary":"Get audience settings","tags":["Settings"],"description":"Read the brand's target audience, primary topics, default language/country, and target regions.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"x-mcp":{"name":"brand_audience"},"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update audience settings","tags":["Settings"],"description":"Update the brand's target audience, primary topics, default language/country, and target regions. All fields optional; only provided fields change.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"teamId":{"type":"string"},"primaryTopics":{"type":"array","items":{"type":"string"}},"targetAudience":{"type":"array","items":{"type":"string"}},"defaultLanguage":{"type":"string"},"defaultCountry":{"type":"string","nullable":true},"regions":{"type":"array","nullable":true,"items":{"type":"object","additionalProperties":true}}}}}}},"x-mcp":{"name":"update_brand_audience"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/competitors":{"get":{"summary":"List brand competitors","tags":["Settings"],"description":"Read the team's tracked competitors (name, website, active/ignored flags).","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"x-mcp":{"name":"brand_competitors"},"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Replace brand competitors","tags":["Settings"],"description":"Full replace of the team's competitor list. Each entry needs name + website; may include an existing id to update in place. active defaults to true, ignored to false. Sending an empty array clears all competitors.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"teamId":{"type":"string"},"competitors":{"type":"array","items":{"type":"object","additionalProperties":true,"required":["name","website"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"website":{"type":"string"},"active":{"type":"boolean"},"ignored":{"type":"boolean"}}}}}}}}},"x-mcp":{"name":"update_brand_competitors"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/suggest-competitors":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/discovered-competitors":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/domain-rating":{"get":{"operationId":"getBrandDomainRating","summary":"Get brand domain rating","tags":["Settings"],"description":"Returns the Ahrefs Domain Rating (0-100) for the team's own website.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"domain":{"type":"string","nullable":true},"rating":{"type":"number","nullable":true},"status":{"type":"string","enum":["ready","pending","unavailable"]},"updatedAt":{"type":"string","nullable":true}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"}}}}}}}}},"/v3/settings/brand/knowledge-base/":{"get":{"summary":"List brand memory entries","tags":["Settings"],"description":"List the team's Brand Memory (knowledge base) entries and storage usage.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"x-mcp":{"name":"list_brand_memory"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/knowledge-base/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Rename or edit a brand memory entry","tags":["Settings"],"description":"Rename (any entry) and/or edit the content (text entries only) of a Brand Memory document by id.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"teamId":{"type":"string"},"name":{"type":"string"},"content":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Document ID"}],"x-mcp":{"name":"update_brand_memory"},"responses":{"200":{"description":"Default Response"}}},"delete":{"summary":"Delete a brand memory entry","tags":["Settings"],"description":"Remove a Brand Memory document by id.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"path","name":"id","required":true,"description":"Document ID"}],"x-mcp":{"name":"delete_brand_memory"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/knowledge-base/text":{"post":{"summary":"Add a brand memory text note","tags":["Settings"],"description":"Add a freeform text note to the team's Brand Memory (≤ 4000 words). The title must be unique within the team - it identifies the note.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["content","name"],"properties":{"teamId":{"type":"string"},"name":{"type":"string","description":"Short title for the note. Identifies it, so it must be unique within the team."},"content":{"type":"string"}}}}}},"x-mcp":{"name":"add_brand_memory_note"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/knowledge-base/url":{"post":{"summary":"Import a URL into brand memory","tags":["Settings"],"description":"Import a public http(s) URL into the team's Brand Memory (the page is scraped, then indexed asynchronously).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["url"],"properties":{"teamId":{"type":"string"},"url":{"type":"string"}}}}}},"x-mcp":{"name":"add_brand_memory_url"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/brand/knowledge-base/file":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/crawling/":{"get":{"operationId":"getCrawlSettings","summary":"Get the team's crawl settings","tags":["Crawl Settings"],"description":"How SnowSEO crawls and audits this team's site: whether auto-crawl, auto-PageSpeed and auto-IndexNow are on, how often each runs, which sitemaps and subdomains are included, and which URL patterns are excluded. These settings govern SEO audits, PageSpeed and GEO alike.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"link","required":false,"description":"Optional site URL. Defaults to the team's configured website."}],"x-mcp":{"name":"crawl_settings","teamScoped":true},"responses":{"200":{"description":"Default Response"}}},"patch":{"operationId":"updateCrawlSettings","summary":"Update the team's crawl settings","tags":["Crawl Settings"],"description":"Changes how SnowSEO crawls and audits this site. Affects future scheduled work for SEO audits, PageSpeed and GEO — turning on auto-crawl or auto-PageSpeed causes recurring credit and quota spend, so confirm with the user first. Only the fields you send are changed. Call crawl_settings first to see the current values.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId"],"properties":{"teamId":{"type":"string","description":"SnowSEO team ID. Call list_teams first to choose a team."},"link":{"type":"string","description":"Optional site URL. Defaults to the team's configured website."},"autoCrawl":{"type":"boolean","description":"Re-crawl and re-audit the site on a schedule."},"crawlingFrequency":{"type":"string","nullable":true,"description":"How often auto-crawl runs, e.g. weekly. Null clears it."},"autoPageSpeed":{"type":"boolean","description":"Re-run PageSpeed on a schedule. Consumes PageSpeed quota every cycle."},"pageSpeedFrequency":{"type":"string","nullable":true,"description":"How often auto-PageSpeed runs. Null clears it. Also controls how long stored results are considered fresh."},"autoIndexNow":{"type":"boolean","description":"Automatically submit new and changed URLs to IndexNow."},"selectedSitemaps":{"type":"array","items":{"type":"string"},"description":"Sitemap URLs to crawl from."},"selectedSubdomains":{"type":"array","items":{"type":"string"},"description":"Subdomains treated as part of this site. Pages on other hosts are flagged out of scope."},"excludedUrls":{"type":"array","items":{"type":"string"},"description":"URL patterns to exclude from crawling and auditing."}}}}}},"x-mcp":{"name":"update_crawl_settings","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/crawling/refresh":{"post":{"operationId":"refreshCrawlSources","summary":"Re-read the site's sitemaps","tags":["Crawl Settings"],"description":"Re-fetches the site's sitemaps and refreshes the discovered URL list and subdomain options. Does not crawl or audit anything, so it spends no credits.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId","link"],"properties":{"teamId":{"type":"string","description":"SnowSEO team ID. Call list_teams first to choose a team."},"link":{"type":"string","description":"The site's URL or bare domain, e.g. https://example.com."}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/notifications/":{"get":{"summary":"Get notification settings","tags":["Settings"],"description":"Read the organization's email/inbox notification preferences (weekly reports, monthly audits, new opportunities, resource warnings, client report recipients). These are org-wide: every brand in the organization shares them.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID used to resolve the organization these org-wide settings belong to"}],"x-mcp":{"name":"notification_settings"},"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Update notification settings","tags":["Settings"],"description":"Update the organization's notification preferences. These are org-wide, so the change applies to every brand in the organization. All fields optional; only provided fields change. reportRecipients replaces the client-report recipient list (each entry: email + weekly/monthly/whiteLabel booleans + teamIds). weeklyReportTeamIds / monthlyAuditTeamIds scope the org's own reports to specific brands; omit or send null for all brands.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"teamId":{"type":"string"},"weeklyReports":{"type":"boolean"},"monthlyAudits":{"type":"boolean"},"newOpportunities":{"type":"boolean"},"resourceUsageWarning":{"type":"boolean"},"clientReportsEnabled":{"type":"boolean"},"weeklyReportTeamIds":{"type":"array","nullable":true,"items":{"type":"string"},"description":"Brands the weekly report covers. Null or omitted means all brands."},"monthlyAuditTeamIds":{"type":"array","nullable":true,"items":{"type":"string"},"description":"Brands the monthly audit covers. Null or omitted means all brands."},"reportRecipients":{"type":"array","items":{"type":"object","additionalProperties":true,"required":["email"],"properties":{"email":{"type":"string"},"weekly":{"type":"boolean"},"monthly":{"type":"boolean"},"whiteLabel":{"type":"boolean"},"teamIds":{"type":"array","items":{"type":"string"},"description":"Brands this recipient receives reports for. Empty delivers nothing."}}}}}}}}},"x-mcp":{"name":"update_notification_settings"},"responses":{"200":{"description":"Default Response"}}}},"/v3/settings/strategies/":{"get":{"summary":"List content strategies (actions)","tags":["Settings"],"description":"Read the team's content strategies/actions with their selected state.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"x-mcp":{"name":"content_strategies"},"responses":{"200":{"description":"Default Response"}}},"patch":{"summary":"Toggle a content strategy","tags":["Settings"],"description":"Select or deselect a single content strategy/action for the team.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["strategyId","isSelected"],"properties":{"teamId":{"type":"string"},"strategyId":{"type":"string"},"isSelected":{"type":"boolean"}}}}}},"x-mcp":{"name":"update_content_strategy"},"responses":{"200":{"description":"Default Response"}}}},"/v3/sitemaps/":{"get":{"operationId":"listSitemaps","summary":"List the site's sitemaps","tags":["Sitemaps"],"description":"Every sitemap SnowSEO knows about for this site, with how many URLs each contains and whether it was fetched successfully. Use this to check sitemap health or find out why pages are missing from the crawl.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."}],"x-mcp":{"name":"sitemaps","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/sitemaps/urls":{"get":{"operationId":"listSitemapUrls","summary":"List the inspected URLs in one sitemap","tags":["Sitemaps"],"description":"The individual URLs Google found through a given sitemap, with each one's index verdict. Use this to see which pages in a sitemap are indexed and which are not.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"sitemapUrl","required":true,"description":"The sitemap to list URLs for, as returned by the sitemaps list."},{"schema":{"type":"integer","minimum":1,"default":1},"in":"query","name":"page","required":false},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":10},"in":"query","name":"pageSize","required":false}],"x-mcp":{"name":"sitemap_urls","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/sitemaps/gsc":{"get":{"operationId":"getGscSitemaps","summary":"Get sitemap status from Google Search Console","tags":["Sitemaps"],"description":"Sitemaps as Google Search Console reports them: when Google last read each one, how many URLs it found, and any errors or warnings Google raised. Use this to answer 'is Google actually reading my sitemap'. Requires GSC to be connected for the team.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."}],"x-mcp":{"name":"sitemaps_gsc","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/sitemaps/generate":{"post":{"operationId":"generateSitemap","summary":"Generate an XML sitemap for the site","tags":["Sitemaps"],"description":"Builds an XML sitemap from the team's crawled pages, honouring the excluded-URL rules. With makePublic=true it PUBLISHES the sitemap to a public URL that search engines can fetch — that is outward-facing, so confirm with the user before setting it. Leave makePublic false to just produce the file.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId"],"properties":{"teamId":{"type":"string","description":"SnowSEO team ID. Call list_teams first to choose a team."},"makePublic":{"type":"boolean","default":false,"description":"Publish the sitemap at a public URL. Outward-facing — ask the user first."}}}}}},"x-mcp":{"name":"generate_sitemap","teamScoped":true},"responses":{"200":{"description":"Default Response"}}},"delete":{"operationId":"deleteGeneratedSitemap","summary":"Delete the generated sitemap","tags":["Sitemaps"],"description":"Deletes the sitemap SnowSEO generated for this team and takes down its hosted copy. This is DESTRUCTIVE and outward-facing - any search engine using the public URL will start getting a 404 - so confirm with the user first. Source sitemaps the team tracks are untouched.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."}],"x-mcp":{"name":"delete_generated_sitemap","teamScoped":true},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"}}}}}}}}},"/v3/sitemaps/submit-gsc":{"post":{"operationId":"submitSitemapToGsc","summary":"Submit a sitemap to Google Search Console","tags":["Sitemaps"],"description":"Submits a sitemap URL to Google Search Console for this site. This SENDS DATA TO GOOGLE and changes what Google crawls — always confirm the exact sitemap URL with the user first. Requires GSC to be connected. Check sitemaps_gsc afterwards to see how Google processed it.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId"],"properties":{"teamId":{"type":"string","description":"SnowSEO team ID. Call list_teams first to choose a team."},"sitemapUrl":{"type":"string","description":"Full URL of the sitemap to submit, e.g. https://example.com/sitemap.xml. Defaults to the team's generated sitemap."}}}}}},"x-mcp":{"name":"submit_sitemap_to_gsc","teamScoped":true},"responses":{"200":{"description":"Default Response"}}}},"/v3/topic-clusters/suggest-groups":{"post":{"operationId":"suggestKeywordGroups","summary":"Suggest keyword topic groupings","tags":["Topic Clusters"],"description":"Uses AI to split a list of keywords into topic clusters, preferring existing topics and suggesting new ones when needed. Optionally matches a list of questions (e.g. Search Console question queries) onto the resulting clusters as AI prompts. Costs 1 AI credit per 100 unique keywords; question matching is free. Returns 403 without charging when the balance cannot cover the whole run.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId","keywords"],"properties":{"teamId":{"type":"string"},"keywords":{"type":"array","items":{"type":"object","required":["keyword"],"properties":{"keyword":{"type":"string"},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true}}}},"questions":{"type":"array","items":{"type":"string"}},"targetClusterCount":{"type":"number","nullable":true},"clusterMode":{"type":"string","enum":["existing","new","mixed"],"nullable":true},"userIntent":{"type":"string","nullable":true}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"groups":{"type":"array","items":{"type":"object","properties":{"topicId":{"type":"string","nullable":true},"topicName":{"type":"string"},"isNew":{"type":"boolean"},"keywords":{"type":"array","items":{"type":"string"}},"prompts":{"type":"array","items":{"type":"string"}}}}},"questionsConsidered":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"requiredCredits":{"type":"number"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/suggest-groups/start":{"post":{"operationId":"startKeywordGrouping","summary":"Queue an AI keyword grouping run","tags":["Topic Clusters"],"description":"Validates the keywords, reserves nothing, checks the AI-credit balance covers the whole run, then queues it. Poll /suggest-groups/job-status with the returned jobId for progress and the grouped result. Costs 1 AI credit per 100 unique keywords; question matching is free.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId","keywords"],"properties":{"teamId":{"type":"string"},"keywords":{"type":"array","items":{"type":"object","required":["keyword"],"properties":{"keyword":{"type":"string"},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true}}}},"questions":{"type":"array","items":{"type":"string"}},"targetClusterCount":{"type":"number","nullable":true},"clusterMode":{"type":"string","enum":["existing","new","mixed"],"nullable":true},"userIntent":{"type":"string","nullable":true},"source":{"type":"string","enum":["gsc-auto-create","smart-group"],"nullable":true}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"jobId":{"type":"string"},"totalChunks":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"403":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"requiredCredits":{"type":"number"}}}}}}}}},"/v3/topic-clusters/suggest-groups/active-job":{"get":{"operationId":"keywordGroupingActiveJob","summary":"Live keyword grouping run for this team","tags":["Topic Clusters"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true},{"schema":{"type":"string","enum":["gsc-auto-create","smart-group"]},"in":"query","name":"source","required":false}],"responses":{"200":{"description":"Default Response"}}}},"/v3/topic-clusters/suggest-groups/job-status":{"get":{"operationId":"keywordGroupingJobStatus","summary":"Status of one keyword grouping job","tags":["Topic Clusters"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true},{"schema":{"type":"string"},"in":"query","name":"jobId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/topic-clusters/suggest-groups/notify-when-done":{"post":{"operationId":"notifyWhenKeywordGroupingDone","summary":"Notify me when this grouping run finishes","tags":["Topic Clusters"],"description":"Turns the completion notification for one run on or off. Send `notify: false` when reattaching to a run already being watched, so it is not announced to a user who can see it finish.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId","jobId"],"properties":{"teamId":{"type":"string"},"jobId":{"type":"string"},"notify":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/apply-groups":{"post":{"operationId":"applyKeywordGroups","summary":"Apply keyword groupings transactionally","tags":["Topic Clusters"],"description":"Creates any new topics and links/moves each keyword into its target topic in a single DB transaction (all-or-nothing).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId","groups"],"properties":{"teamId":{"type":"string"},"track":{"type":"boolean","nullable":true},"groups":{"type":"array","items":{"type":"object","required":["topicName","keywords"],"properties":{"topicId":{"type":"string","nullable":true},"topicName":{"type":"string"},"keywords":{"type":"array","items":{"type":"object","required":["keyword"],"properties":{"keyword":{"type":"string"},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true},"locationCriteriaId":{"type":"number","nullable":true},"locationCanonicalName":{"type":"string","nullable":true}}}}}}}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"createdTopics":{"type":"number"},"added":{"type":"number"},"moved":{"type":"number"},"alreadyHere":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/":{"post":{"summary":"Create a topic cluster","tags":["Topic Clusters"],"description":"Creates a new topic cluster for the team.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["topic"],"properties":{"teamId":{"type":"string","description":"Team ID"},"topic":{"type":"string","description":"Topic name"}}}}}},"x-mcp":{"name":"create_topic_cluster"},"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"get":{"summary":"List topic clusters","tags":["Topic Clusters"],"description":"Returns all topic clusters for a team with visibility and authority scores.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"x-mcp":{"name":"topic_clusters_list"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"summary":{"type":"object","properties":{"totalKeywords":{"type":"number"},"trackedPrompts":{"type":"number"},"avgSearchVisibility":{"type":"number"},"avgAiVisibility":{"type":"number"}}},"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"createdAt":{"type":"string"},"keywordCount":{"type":"number"},"promptCount":{"type":"number"},"trackedPromptCount":{"type":"number"},"trackedKeywordCount":{"type":"number"},"aiVisibility":{"type":"number"},"searchVisibility":{"type":"number"},"topicalAuthorityScore":{"type":"number"},"coveragePct":{"type":"number"},"coverage":{"type":"object","properties":{"total":{"type":"number"},"published":{"type":"number"},"generated":{"type":"number"},"planned":{"type":"number"},"unused":{"type":"number"}}},"changePct":{"type":"number","nullable":true},"trend":{"type":"string","enum":["rising","falling","stable"]},"leaders":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"domain":{"type":"string"}}}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/contains":{"get":{"summary":"Check cluster containment","tags":["Topic Clusters"],"description":"Checks if any topic cluster contains the given keyword or prompt.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"keyword","required":false,"description":"Keyword to search for"},{"schema":{"type":"string"},"in":"query","name":"prompt","required":false,"description":"Prompt text to search for"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string","nullable":true},"prompt":{"type":"string","nullable":true},"clustersContainingKeyword":{"type":"array","items":{"type":"string"}},"clustersContainingPrompt":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/links":{"get":{"summary":"Get linked keywords and prompts","tags":["Topic Clusters"],"description":"Returns the keywords and prompts linked to a topic cluster.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Topic cluster ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"topicId":{"type":"string"},"name":{"type":"string"},"keywords":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"keyword":{"type":"string"},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true},"locationCriteriaId":{"type":"number","nullable":true},"locationCanonicalName":{"type":"string","nullable":true}}}},"prompts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"prompt":{"type":"string"}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/links/batch":{"get":{"summary":"Batch get links for all clusters","tags":["Topic Clusters"],"description":"Returns all keywords and prompts linked to every topic cluster for a team.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"clusters":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"keywords":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"keyword":{"type":"string"},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true},"locationCriteriaId":{"type":"number","nullable":true},"locationCanonicalName":{"type":"string","nullable":true}}}},"prompts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"prompt":{"type":"string"}}}}}}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}":{"get":{"summary":"Get topic cluster details","tags":["Topic Clusters"],"description":"Returns full details for a topic cluster including keywords, prompts, and performance.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false,"description":"Team ID"},{"schema":{"type":"string"},"in":"query","name":"days","required":false,"description":"Legacy rolling-window fallback (number of days). Prefer startDate + endDate."},{"schema":{"type":"string"},"in":"query","name":"startDate","required":false,"description":"Window start date (YYYY-MM-DD, UTC). Takes precedence over days."},{"schema":{"type":"string"},"in":"query","name":"endDate","required":false,"description":"Window end date (YYYY-MM-DD, UTC). Takes precedence over days."},{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Topic cluster ID"}],"x-mcp":{"name":"topic_cluster_detail"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"object","additionalProperties":true},"overview":{"type":"object","additionalProperties":true},"trend":{"type":"object","additionalProperties":true},"performance":{"type":"object","additionalProperties":true},"keywords":{"type":"array","items":{"type":"object","additionalProperties":true}},"prompts":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"delete":{"summary":"Delete a topic cluster","tags":["Topic Clusters"],"description":"Deletes a topic cluster. DESTRUCTIVE beyond the cluster itself: every PLANNED content item in it is deleted along with it and cannot be recovered, because content planner rows cascade on the topic. Its keyword and prompt links are removed too, though the keywords and prompts themselves stay in the team's lists. Published and generated articles are kept, but lose their cluster. Tell the user how many planned items will be lost and get explicit confirmation before calling this.","parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Topic cluster ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}},"patch":{"summary":"Rename a topic cluster","tags":["Topic Clusters"],"description":"Updates a topic cluster's name.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["topic"],"properties":{"teamId":{"type":"string","description":"Team ID"},"topic":{"type":"string","description":"New topic name"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Topic cluster ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/keywords":{"post":{"summary":"Add keyword to topic cluster","tags":["Topic Clusters"],"description":"Links a keyword to a topic cluster, optionally tracking it for rank monitoring.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string","description":"Team ID"},"keyword":{"type":"string","description":"Keyword text to add"},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true},"locationCriteriaId":{"type":"number","nullable":true,"description":"Google Ads location criteria ID for city/region-level tracking. Omit/null for country-only."},"locationCanonicalName":{"type":"string","nullable":true,"description":"Canonical location name paired with locationCriteriaId."},"items":{"type":"array","description":"Bulk mode: one item per keyword. Items already linked to another topic are skipped.","items":{"type":"object","required":["keyword"],"properties":{"keyword":{"type":"string"},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true},"locationCriteriaId":{"type":"number","nullable":true},"locationCanonicalName":{"type":"string","nullable":true}}}},"track":{"type":"boolean","description":"Whether to also track this keyword for rank monitoring"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Topic cluster ID"}],"x-mcp":{"name":"add_keywords_to_topic"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"keywordId":{"type":"string"},"countryId":{"type":"string","nullable":true},"languageId":{"type":"string","nullable":true},"locationCriteriaId":{"type":"number","nullable":true},"locationCanonicalName":{"type":"string","nullable":true},"requested":{"type":"number"},"added":{"type":"number"},"alreadyHere":{"type":"number"},"skipped":{"type":"number"},"keywordsNotTracked":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/keywords/move":{"post":{"operationId":"moveTopicKeyword","summary":"Move a keyword to another topic cluster","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"keywordId":{"type":"string"},"targetTopicId":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Source topic cluster ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"keywordId":{"type":"string"},"targetTopicId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/keywords/batch-move":{"post":{"operationId":"batchMoveTopicKeywords","summary":"Move multiple keywords to another topic cluster","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"keywordIds":{"type":"array","items":{"type":"string"}},"targetTopicId":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Source topic cluster ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"keywordIds":{"type":"array","items":{"type":"string"}},"targetTopicId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/keywords/batch-remove":{"post":{"operationId":"batchRemoveTopicKeywords","summary":"Remove multiple keywords from a topic cluster","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"keywordIds":{"type":"array","items":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Topic cluster ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"removed":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/prompts":{"post":{"operationId":"addTopicPrompts","summary":"Add prompts to a topic cluster","tags":["Topic Clusters"],"description":"Links existing prompts or creates new ones and attaches them to a topic cluster.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"prompts":{"type":"array","description":"Each item is either { promptId } to link an existing prompt or { prompt, intent, region? } to create a new one. region is the structured country-level object { type, city, state, country, iso2, iso3 }; omit for worldwide.","items":{"type":"object","additionalProperties":true,"properties":{"promptId":{"type":"string"},"prompt":{"type":"string"},"intent":{"type":"string"},"region":{"type":"object","additionalProperties":true,"properties":{"type":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"country":{"type":"string"},"iso2":{"type":"string"},"iso3":{"type":"string"}}}}}},"intents":{"type":"object","description":"Map of prompt text → intent override","additionalProperties":{"type":"string"}},"track":{"type":"boolean","description":"Whether to enable tracking on newly linked prompts"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Topic cluster ID"}],"x-mcp":{"name":"add_prompts_to_topic"},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["success","linked","created","promptIds"],"properties":{"success":{"type":"boolean"},"linked":{"type":"number"},"created":{"type":"number"},"skipped":{"type":"number"},"promptsSkipped":{"type":"number"},"alreadyLinked":{"type":"number"},"promptIds":{"type":"array","items":{"type":"string"}}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/prompts/move":{"post":{"operationId":"moveTopicPrompt","summary":"Move a prompt to another topic cluster","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"promptId":{"type":"string"},"targetTopicId":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Source topic cluster ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"promptId":{"type":"string"},"targetTopicId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/prompts/batch-move":{"post":{"operationId":"batchMoveTopicPrompts","summary":"Move multiple prompts to another topic cluster","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"promptIds":{"type":"array","items":{"type":"string"}},"targetTopicId":{"type":"string"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Source topic cluster ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"promptIds":{"type":"array","items":{"type":"string"}},"targetTopicId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/prompts/batch-remove":{"post":{"operationId":"batchRemoveTopicPrompts","summary":"Remove multiple prompts from a topic cluster","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"promptIds":{"type":"array","items":{"type":"string"}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Topic cluster ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"removed":{"type":"number"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/tracking":{"patch":{"operationId":"updateTopicTracking","summary":"Update tracking for a topic cluster","tags":["Topic Clusters"],"description":"Enable or disable keyword and prompt tracking for a topic cluster.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"active":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true,"description":"Topic cluster ID"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"updated":{"type":"number"},"promptsSkipped":{"type":"number"},"trackedKeywordsUpdated":{"type":"number"},"trackedKeywordsCreated":{"type":"number"},"active":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/topics/tracking":{"patch":{"operationId":"batchUpdateTopicsTracking","summary":"Batch update tracking for multiple topic clusters","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"topicIds":{"type":"array","items":{"type":"string"}},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"results":{"type":"array","items":{"type":"object","additionalProperties":true}},"notFound":{"type":"array","items":{"type":"string"}},"totalCreated":{"type":"number"},"totalUpdated":{"type":"number"},"promptsSkipped":{"type":"number"},"active":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/prompts/{promptId}/active":{"patch":{"operationId":"updateTopicPromptActive","summary":"Update active state of a prompt in a topic cluster","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"active":{"type":"boolean"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true},{"schema":{"type":"string"},"in":"path","name":"promptId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"promptId":{"type":"string"},"active":{"type":"boolean"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/keywords/{keywordId}":{"delete":{"operationId":"removeTopicKeyword","summary":"Remove a keyword from a topic cluster","tags":["Topic Clusters"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true},{"schema":{"type":"string"},"in":"path","name":"keywordId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"keywordId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/{topicId}/prompts/{promptId}":{"delete":{"operationId":"removeTopicPrompt","summary":"Remove a prompt from a topic cluster","tags":["Topic Clusters"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"topicId","required":true},{"schema":{"type":"string"},"in":"path","name":"promptId","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"promptId":{"type":"string"}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/map":{"get":{"summary":"Topic map with live coverage","tags":["Topic Clusters"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":false},{"schema":{"type":"string"},"in":"query","name":"topicId","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/map/refresh":{"post":{"summary":"Refresh topic map snapshot","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"teamId":{"type":"string"},"domain":{"type":"string"},"countryId":{"type":"string"},"languageId":{"type":"string"}},"required":["domain"]}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/map/suggestions":{"post":{"summary":"Generate net-new opportunities for a topic","tags":["Topic Clusters"],"description":"On-demand AI discovery of keyword/prompt ideas not yet linked to the topic. Cached per topic; deducts flat AI credits on generation.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["topicId"],"properties":{"teamId":{"type":"string"},"topicId":{"type":"string"},"country":{"type":"string","nullable":true},"language":{"type":"string","nullable":true},"force":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"502":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/map/suggestions/accept":{"post":{"summary":"Add a suggested opportunity to a topic","tags":["Topic Clusters"],"description":"Persists a net-new keyword/prompt gap into the topic as an unused atom. Reuses the topic-map link path; does not schedule an article.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["topicId","kind","value"],"properties":{"teamId":{"type":"string"},"topicId":{"type":"string"},"kind":{"type":"string","enum":["keyword","prompt"]},"value":{"type":"string"},"intent":{"type":"string","nullable":true}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/map/source-context":{"post":{"summary":"Resolve clicked source context","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["sourceKind","sourceValue"],"properties":{"teamId":{"type":"string"},"sourceKind":{"type":"string","enum":["keyword","prompt"]},"sourceValue":{"type":"string"},"keywordId":{"type":"string"},"trackedKeywordId":{"type":"string"},"promptId":{"type":"string"},"sourceSurface":{"type":"string"},"sourceId":{"type":"string"}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/topic-clusters/map/article-candidates":{"post":{"summary":"Generate schedule-ready article candidates","tags":["Topic Clusters"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["lockedPrimary"],"additionalProperties":true,"properties":{"teamId":{"type":"string"},"topicId":{"type":"string"},"topicName":{"type":"string"},"lockedPrimary":{"type":"object","additionalProperties":true},"complementaryPrimary":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/url-inspection/inspect":{"post":{"operationId":"urlInspect","summary":"Inspect a single URL's Google index status","tags":["URL Inspection"],"description":"Calls Google Search Console's URL Inspection API for one URL and persists the verdict (indexed, blocked, not found, etc). Requires GSC connected for the team.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId","url"],"properties":{"teamId":{"type":"string","description":"SnowSEO team ID. Call list_teams first to choose a team."},"url":{"type":"string","description":"Full URL to inspect."}}}}}},"x-mcp":{"name":"url_inspect"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"429":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"code":{"type":"string"},"error":{"type":"string"}}}}}},"500":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/url-inspection/index-coverage":{"get":{"operationId":"urlIndexCoverage","summary":"Get Google index coverage tally","tags":["URL Inspection"],"description":"Counts of inspected URLs per Google index verdict (indexed, crawled-not-indexed, blocked, not-found, etc) from prior URL Inspection API calls.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."}],"x-mcp":{"name":"url_index_coverage"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/url-inspection/index-coverage/pages":{"get":{"operationId":"urlIndexCoveragePages","summary":"List per-URL Google index verdicts","tags":["URL Inspection"],"description":"Paginated per-URL rows behind the index coverage tally — verdict, coverage/indexing state, canonical info, and a link to the Search Console inspection result for each URL. Optionally filter by verdict.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."},{"schema":{"type":"string"},"in":"query","name":"verdict","required":false,"description":"Optional filter: an exact verdict (e.g. indexed, blocked, not_found) or 'not_indexed' for everything except indexed."},{"schema":{"type":"integer"},"in":"query","name":"limit","required":false,"description":"Max rows to return (default 50)."},{"schema":{"type":"integer"},"in":"query","name":"offset","required":false,"description":"Rows to skip (default 0)."}],"x-mcp":{"name":"url_index_coverage_pages"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/url-inspection/inspect-batch":{"post":{"operationId":"urlInspectBatch","summary":"Run a background Google index check","tags":["URL Inspection"],"description":"Enqueues a background job that inspects the team's discovered URLs (or an explicit URL list) against Google's URL Inspection API, rate-limited to GSC's quota. Poll url_inspect_status for progress; results land in url_index_coverage / url_index_coverage_pages as they complete.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["teamId"],"properties":{"teamId":{"type":"string","description":"SnowSEO team ID. Call list_teams first to choose a team."},"urls":{"type":"array","items":{"type":"string"},"description":"Optional explicit URLs to inspect. Omit to inspect the team's discovered URLs (prioritizing never-inspected ones)."}}}}}},"x-mcp":{"name":"url_inspect_batch"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/url-inspection/inspect-status":{"get":{"operationId":"urlInspectStatus","summary":"Check background index-check job status","tags":["URL Inspection"],"description":"Whether a url_inspect_batch background job is currently running for this team, and its progress if so.","parameters":[{"schema":{"type":"string"},"in":"query","name":"teamId","required":true,"description":"SnowSEO team ID. Call list_teams first to choose a team."}],"x-mcp":{"name":"url_inspect_status"},"responses":{"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}}}},"/v3/url-inspection/job-status":{"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/user/avatar":{"post":{"responses":{"200":{"description":"Default Response"}}}},"/v3/user/data-export/":{"post":{"responses":{"200":{"description":"Default Response"}}},"get":{"responses":{"200":{"description":"Default Response"}}}},"/v3/user/data-export/{id}":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/user/data-export/{id}/download":{"get":{"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v3/user/marketing-preferences/":{"get":{"responses":{"200":{"description":"Default Response"}}},"patch":{"responses":{"200":{"description":"Default Response"}}}}},"servers":[{"url":"https://api.snowseo.com","description":"Production server"}],"tags":[{"name":"Keywords","description":"Keyword research and suggestion end-points"},{"name":"Onboarding","description":"Brand onboarding and strategy end-points"},{"name":"Brands","description":"Brand management end-points"},{"name":"Organizations","description":"Organization and member end-points"},{"name":"Integrations","description":"Google Search Console and other integrations"},{"name":"Utilities","description":"Common utility end-points like screenshots and uploads"}],"externalDocs":{"url":"https://snowseo.com/docs","description":"Find more info here"}}