Skip to content
Docs/API Reference

API Reference

SEO Dashboard API

Public surface for SEO Dashboard. Every registered tool is callable two ways: POST /api/v1/{tool} (this REST envelope) and POST /api/mcp (Model Context Protocol's Streamable HTTP transport, used by Claude Desktop / Code / Cursor). Both authenticate with the same Bearer API key; issue one at /settings?tab=api-keys. The /api/mcp body shape is JSON-RPC 2.0. see the MCP spec at https://spec.modelcontextprotocol.io for message formats.

v1.0.0OpenAPI 3.1.0Raw spec

Authentication

Every endpoint requires a Bearer token in the Authorization header. Mint API keys at /settings?tab=api-keys; per-key scopes gate which tools the key can call.

curl -X POST https://seodash.app/api/v1/competitor_serp \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"query": "best seo tools", "depth": 10}'

accessibility

post/api/v1/accessibility

Run a heuristic WCAG/ADA audit against a page's HTML and report scored, weighted checks.

Request body

Required

  • url: string

Optional

  • username: string
  • password: string
200400401402404429500502

ahrefs

post/api/v1/ahrefs_keywords

Fetch the top 50 organic keywords a target domain or URL ranks for.

Request body

Required

  • target: string

Optional

  • provider: string
200400401402404429500502
post/api/v1/ahrefs_overview

Fetch domain-level overview metrics (DR, traffic, organic keywords) from the configured SEO provider.

Request body

Required

  • target: string

Optional

  • provider: string
200400401402404429500502

ai

post/api/v1/ai_meta

Fetch a page and ask the LLM for three optimized title and three optimized description alternatives.

Request body

Required

  • url: string
200400401402404429500502
post/api/v1/ai_visibility_dropouts

Recent dropout alerts: prompt × engine combinations where the brand was previously cited and has gone absent for a streak of runs. Lookback window in days.

Request body

Required

  • siteId: integer

Optional

  • windowDays: integer
200400401402404429500502
post/api/v1/ai_visibility_engine_detail

Per-prompt breakdown for a single engine plus the top competitors gaining mentions there. Use this to find specific prompts where the brand is absent or losing ground on a given engine.

Request body

Required

  • siteId: integer
  • engine: string
200400401402404429500502
post/api/v1/ai_visibility_period_compare

Compare current vs prior rolling window (default 28 days) per engine. Returns score deltas, share-of-voice band shifts, and per-(prompt × engine) dropouts where the brand fell from primary/mentioned to passing/absent. Use this for any 'why did our share-of-voice drop?' question.

Request body

Required

  • siteId: integer

Optional

  • windowDays: integer
200400401402404429500502
post/api/v1/ai_visibility_prompt_history

Per-engine run history for a single prompt, including position outcome and cost. Use to inspect a specific prompt's trajectory after the period-compare or dropouts tools surface it as a problem area.

Request body

Required

  • promptId: integer

Optional

  • limit: integer
200400401402404429500502
post/api/v1/ai_visibility_summary

Site-wide AI Visibility roll-up: per-engine visibility score + score band (subject-only, not competitor-relative share of voice), prompt counts, and last run timestamps. Use this first to get the lay of the land before drilling into a specific engine. For competitor-relative share of voice, use ai_visibility_period_compare.

Request body

Required

  • siteId: integer
200400401402404429500502

alert

post/api/v1/alert_update

Toggle an alert (enabled flag) or update its threshold by alert_type.

Request body

Required

  • alert_type: string

Optional

  • enabled: boolean
  • threshold: union
200400401402404429500502

alerts

post/api/v1/alerts_list

List alert settings and the most recent 50 alert log entries.

200400401402404429500502

analytics

post/api/v1/analytics_dailystats

Fetch the daily-stats time series (visitors/pageviews/bounce/duration) for a site over a range.

Request body

Required

  • siteId: string
  • startAt: integer
  • endAt: integer
200400401402404429500502
post/api/v1/analytics_pageviews

Fetch the pageview time series from the configured analytics provider, bucketed by day or hour.

Request body

Required

  • siteId: string
  • startAt: integer
  • endAt: integer

Optional

  • unit: string
200400401402404429500502
post/api/v1/analytics_realtime

Fetch current-visitor / current-pageview metrics from the analytics provider. Uncached.

Request body

Required

  • siteId: string
200400401402404429500502
post/api/v1/analytics_sites

List all sites/properties known to the configured analytics provider.

200400401402404429500502
post/api/v1/analytics_stats

Fetch summary stats (visitors, pageviews, bounce rate) from the configured analytics provider.

Request body

Required

  • siteId: string
  • startAt: integer
  • endAt: integer
200400401402404429500502

anchor

post/api/v1/anchor_text

Classify <a> anchor texts on a page (Branded, Exact Match, Generic, Naked URL, etc.) and return a distribution.

Request body

Required

  • url: string
200400401402404429500502

audit

post/api/v1/audit_anchor_text

Site-wide anchor-text analysis from the latest crawl: top anchors, over-optimization candidates, empty/naked anchors, rel distribution.

Request body

Required

  • siteUrl: string
200400401402404429500502

broken

bulk

post/api/v1/bulk_status

HEAD-probe up to 50 URLs in parallel and return per-URL status + a histogram summary.

Request body

Required

  • urls: array
200400401402404429500502

canonical

post/api/v1/canonical_check

Verify canonical tags and detect chain issues.

Request body

Required

  • url: string
200400401402404429500502

clear

post/api/v1/clear_cache

Wipe the API response cache. Forces the next call from any cached endpoint to fetch fresh.

200400401402404429500502

competitor

post/api/v1/competitor_serp

Pull the top-10 SERP for a keyword, analyze each page, cross-reference user's GSC position, and ask the LLM for competitive analysis.

Request body

Required

  • keyword: string

Optional

  • siteUrl: string
200400401402404429500502

content

post/api/v1/content_analyze

Compute readability + keyword density on a URL or pasted text, with optional LLM-suggested improvements.

Request body

Optional

  • url: string
  • content: string
200400401402404429500502
post/api/v1/content_brief

Generate a structured SEO content brief for a keyword (titles, meta, heading outline, topics, questions). Can also write the article from the brief.

200400401402404429500502
post/api/v1/content_gap

Compare two sites' sitemaps + sample pages and ask the LLM for verified content gaps the target site is genuinely missing.

Request body

Required

  • yourUrl: string
  • competitorUrl: string
200400401402404429500502
post/api/v1/content_ideas

Generate 10 new content ideas the site doesn't already cover, grounded in GSC queries + the crawl inventory.

Request body

Required

  • siteUrl: string
  • queries: array
200400401402404429500502

create

post/api/v1/create_schedule

Create a scheduled agent run. Either recipients[] or channel+channel_identifier is required for delivery.

Request body

Required

  • name: string
  • prompt: string
  • cron_expression: string

Optional

  • channel: string
  • channel_identifier: string
  • recipients: array
  • site_id: integer
  • timezone: string
200400401402404429500502

delete

post/api/v1/delete_schedule

Remove a scheduled agent run by id.

Request body

Required

  • id: integer
200400401402404429500502

discover

post/api/v1/discover_prospects

Run intent-qualified SERP queries, summarize each candidate page, and ask the LLM to score outreach prospects.

Request body

Required

  • topic: string

Optional

  • targetUrl: string
  • limit: integer
  • minDr: number
200400401402404429500502

dns

post/api/v1/dns_lookup

Resolve every DNS record type for a domain and surface email-security and infrastructure gaps.

Request body

Required

  • domain: string
200400401402404429500502

domain

post/api/v1/domain_rating

Fetch a domain's Ahrefs Domain Rating (DR, 0-100). Free, no API key required; works for any domain including competitors. Returns null when DR is unavailable.

Request body

Required

  • target: string. Domain or URL, e.g. example.com
200400401402404429500502

draft

post/api/v1/draft_outreach

Fetch a prospect URL and write a personalized cold outreach email that quotes concrete details from the article.

Request body

Required

  • prospectUrl: string
  • yourSite: string
  • yourAngle: string

Optional

  • yourName: string
  • targetUrl: string
200400401402404429500502

find

post/api/v1/find_orphan_pages

List pages on the site that have no internal inbound links (orphan pages).

Request body

Required

  • siteUrl: string
200400401402404429500502
post/api/v1/find_similar_pages

Find pages on the site that are semantically similar to a given seed page (uses embeddings).

Request body

Required

  • siteUrl: string
  • pageUrl: string

Optional

  • limit: integer
200400401402404429500502

gap

post/api/v1/gap_zone

Pull GSC keywords in striking-distance positions, score opportunity, and ask the LLM for per-keyword optimization recommendations.

Request body

Required

  • siteUrl: string

Optional

  • minPosition: number
  • maxPosition: number
  • limit: integer
200400401402404429500502

get

post/api/v1/get_cluster_context

Hydrated topical cluster: queries, pages, gap topics, and the pillar page for the cluster.

Request body

Required

  • siteUrl: string
  • clusterId: integer
200400401402404429500502
post/api/v1/get_fact_consensus

Cross-source consensus on (subject, predicate). With predicate=null, returns consensus for every predicate on the subject.

Request body

Required

  • siteUrl: string

Optional

  • subjectType: string
  • pageUrl: string
  • subjectKey: string
  • subjectId: integer
  • predicate: string
200400401402404429500502
post/api/v1/get_fact_history

Value history for one (subject, predicate) pair. Useful for 'how has X changed over time' questions.

Request body

Required

  • siteUrl: string
  • predicate: string

Optional

  • subjectType: string
  • pageUrl: string
  • subjectKey: string
  • subjectId: integer
  • limit: integer
200400401402404429500502
post/api/v1/get_fact_stats

Per-source fact counts and last-observed timestamps for the site's fact ledger.

Request body

Required

  • siteUrl: string
200400401402404429500502
post/api/v1/get_linking_suggestions

Open internal-linking suggestions for the site, optionally scoped to a single source page URL.

Request body

Required

  • siteUrl: string

Optional

  • pageUrl: string
  • limit: integer
200400401402404429500502
post/api/v1/get_page_detail

Get full page detail (title, h1, meta, status, etc.) for a specific URL. Pass includeBody=true to get the page text.

Request body

Required

  • siteUrl: string
  • pageUrl: string

Optional

  • includeBody: boolean
200400401402404429500502
post/api/v1/get_site_inventory

List the site's currently-indexed pages from the latest crawl, with optional filter (noindex / errors / slow).

Request body

Required

  • siteUrl: string

Optional

  • filter: string
  • limit: integer
200400401402404429500502
post/api/v1/get_topical_map

Summary of a topical map's clusters (name, authority, query/page counts).

Request body

Required

  • siteUrl: string
  • mapId: integer
200400401402404429500502

global

post/api/v1/global_latency

Measure HTTP response time from up to 20 worldwide nodes via check-host.net and report per-region stats.

Request body

Required

  • url: string
200400401402404429500502

google

heading

post/api/v1/heading_check

Check heading structure (H1-H6) of any page and find issues.

Request body

Required

  • url: string
200400401402404429500502

http

post/api/v1/http_headers

Fetch a URL and report every response header plus security-header coverage.

Request body

Required

  • url: string
200400401402404429500502

internal

keyword

post/api/v1/keyword_research

Ask the LLM for 25 keyword suggestions, 3-5 clusters, 8-10 PAA questions, and 8-10 long-tail variants for a seed keyword.

Request body

Required

  • keyword: string
200400401402404429500502

list

post/api/v1/list_contradictions

List contradictions in the fact ledger. Filter by status (open/noise/meaningful/fixed/all) and predicate.

Request body

Required

  • siteUrl: string

Optional

  • status: string
  • predicate: string
  • limit: integer
200400401402404429500502
post/api/v1/list_schedules

List scheduled agent runs, optionally filtered by status and siteId.

Request body

Optional

  • status: string
  • siteId: integer
200400401402404429500502
post/api/v1/list_topical_maps

List the topical maps generated for a site, including cluster count and gap count per map.

Request body

Required

  • siteUrl: string
200400401402404429500502

mcp

post/api/mcp

Model Context Protocol (Streamable HTTP transport). JSON-RPC requests; the same Bearer key + per-key scopes + per-key rate limit as /api/v1. See https://spec.modelcontextprotocol.io for the message format.

Request body

Required

  • jsonrpc: any
  • method: string. MCP method (initialize, tools/list, tools/call, etc).

Optional

  • id: any
  • params: object
200401429

meta

get/api/v1/_tools

List every callable tool in the registry.

200401

metadata

post/api/v1/metadata_check

Fetch a URL and extract its meta tags (title, description, canonical, OpenGraph, Twitter, JSON-LD, hreflang, word count).

Request body

Required

  • url: string
200400401402404429500502

og

post/api/v1/og_debug

Inspect Open Graph + Twitter card tags and verify the og:image is reachable.

Request body

Required

  • url: string
200400401402404429500502

pagespeed

post/api/v1/pagespeed

Run Google PageSpeed Insights v5 against a URL and return Lighthouse scores, Core Web Vitals, and per-category audits.

Request body

Required

  • url: string

Optional

  • strategy: string
200400401402404429500502

position

post/api/v1/position_tracker_add

Add a keyword to the position tracker for a site. Keyword is lowercased and trimmed; duplicates are rejected.

Request body

Required

  • siteId: integer
  • keyword: string
200400401402404429500502
post/api/v1/position_tracker_delete

Stop tracking a keyword. Cascades to position_history.

Request body

Required

  • id: integer
200400401402404429500502
post/api/v1/position_tracker_list

List the keywords tracked for a site, with the latest known position and a 30-point history.

Request body

Required

  • siteId: integer
200400401402404429500502

query

post/api/v1/query_facts

Read current valid facts about a subject from the bi-temporal ledger. Omit subject for the recent-activity feed.

Request body

Required

  • siteUrl: string

Optional

  • subjectType: string
  • pageUrl: string
  • subjectKey: string
  • subjectId: integer
  • limit: integer
200400401402404429500502

record

post/api/v1/record_fact

Record a user-asserted fact about a subject. Source is always agent_msg with the optional conversationId tracking provenance. Triggers contradiction detection.

Request body

Required

  • siteUrl: string
  • subjectType: string
  • predicate: string
  • value: any

Optional

  • pageUrl: string
  • subjectKey: string
  • subjectId: integer
  • conversationId: integer
200400401402404429500502

redirect

post/api/v1/redirect_check

Walk a URL's redirect chain hop-by-hop with per-hop SSRF validation, surfacing 301/302 mix issues, long chains, and timing.

Request body

Required

  • url: string
200400401402404429500502

regenerate

post/api/v1/regenerate_topical_map

Regenerate a topical map for a site: fetches GSC queries, clusters them with the LLM into 4-8 pillars, and surfaces 5-8 gap topics.

Request body

Optional

  • siteId: integer
  • siteUrl: string
  • queries: array
  • rangeStart: string
  • rangeEnd: string
  • name: string
  • autoFetchQueries: boolean
200400401402404429500502

resolve

post/api/v1/resolve_contradiction

Mark a contradiction as noise (auto-flapping), meaningful (real conflict), or fixed (the underlying data has been corrected).

Request body

Required

  • id: integer
  • resolution: string
200400401402404429500502

robots

post/api/v1/robots_check

Fetch and parse robots.txt, validate every Sitemap URL, surface common issues, and optionally test if a URL is blocked.

Request body

Required

  • domain: string

Optional

  • testUrl: string
200400401402404429500502

semantic

seo

post/api/v1/seo_audit

Crawl up to 1000 pages, extract per-page SEO data, score the site, and ask the LLM for prioritized recommendations. Streams progress.

Request body

Required

  • url: string

Optional

  • maxPages: integer
  • timeout: integer
200400401402404429500502
post/api/v1/seo_briefings_list

List stored SEO briefings for a site (most recent first).

Request body

Required

  • siteId: integer

Optional

  • limit: integer
200400401402404429500502

serp

post/api/v1/serp_analysis

Fetch the live SERP for a keyword and have the LLM extract what top-ranking pages share (content type, headings, key topics, intent, difficulty).

Request body

Required

  • keyword: string
200400401402404429500502

site

post/api/v1/site_add

Add a new site to the dashboard. Triggers onboarding checks + favicon fetch + analytics auto-link in the background.

Request body

Required

  • url: string
  • name: string
200400401402404429500502
post/api/v1/site_delete

Soft-delete a site (sets deleted_at). Pass restore=true to undo a prior soft delete.

Request body

Required

  • id: integer

Optional

  • restore: boolean
200400401402404429500502

sitemap

post/api/v1/sitemap_check

Fetch a sitemap (or sitemap-index), parse every URL, follow sub-sitemaps, surface freshness/dup/size issues, and HEAD-probe a sample.

Request body

Required

  • url: string

Optional

  • skipUrlChecks: boolean
200400401402404429500502

sites

post/api/v1/sites_list

List all sites the tenant has added to the dashboard, with crawl config and analytics linkage.

200400401402404429500502

streaming

post/api/utilities/seo-audit

Streaming variant of seo_audit. Discovers URLs, crawls in batches, aggregates metrics, scores, and emits SSE events for each phase.

Request body

Required

  • url: string. Site URL

Optional

  • maxPages: integer
  • timeout: integer. Per-page fetch timeout (ms).
200

structured

post/api/v1/structured_data

Extract and parse JSON-LD structured-data blocks from a page.

Request body

Required

  • url: string
200400401402404429500502

topic

post/api/v1/topic_authority

Cluster the site's GSC queries into topical pillars, rate each cluster's authority (strong/moderate/weak), and surface 5-8 gap topics with target keywords.

Request body

Required

  • siteUrl: string
  • queries: array
200400401402404429500502

update

post/api/v1/update_schedule

Patch any field on a scheduled agent run by id.

Request body

Required

  • id: integer

Optional

  • name: string
  • prompt: string
  • cron_expression: string
  • channel: string
  • channel_identifier: string
  • recipients: array
  • status: string
  • site_id: union
  • timezone: string
200400401402404429500502

uptime

post/api/v1/uptime_check

Hit a URL three times sequentially and report status + per-request timing + min/avg/max + first-response headers.

Request body

Required

  • url: string
200400401402404429500502
post/api/v1/uptime_history

Last N uptime checks for a monitor (descending by checked_at).

Request body

Required

  • monitorId: integer

Optional

  • limit: integer
200400401402404429500502
post/api/v1/uptime_monitor_create

Create an uptime monitor for a URL. Validates the URL for SSRF, picks a sane interval (1/5/15/30/60 min).

Request body

Required

  • url: string
  • name: string

Optional

  • interval_minutes: integer
  • notify_channels: array
200400401402404429500502
post/api/v1/uptime_monitor_delete

Soft-delete an uptime monitor. Pass restore=true to undo.

Request body

Required

  • id: integer

Optional

  • restore: boolean
200400401402404429500502
post/api/v1/uptime_monitor_update

Update an uptime monitor: toggle active, change interval, rename, change URL, update notify channels.

Request body

Required

  • id: integer

Optional

  • active: boolean
  • interval_minutes: integer
  • name: string
  • url: string
  • notify_channels: array
200400401402404429500502
post/api/v1/uptime_monitors_list

List uptime monitors with rolling 24-hour up-stats.

200400401402404429500502