Most endpoints require an API key:
Authorization: Bearer <api_key>
All paths are under /api/v1:
https://api.seodiff.io/api/v1
You can also call the same paths on https://seodiff.io/api/v1.
If you are integrating for the first time, start with POST /api/v1/validate using wait=true. It gives one response with pass/fail plus links to artifacts.
Returns account + plan info.
List monitored sites.
Add or update a monitored site.
{
"base_url": "https://example.com",
"enabled": true,
"schedule": "nightly",
"config": {}
}
Enqueue a scan. Returns 202 Accepted with an id and a status_url.
{
"base_url": "https://preview.example.com",
"render_js": false,
"lighthouse": false
}
CI-friendly wrapper around scanning. When wait is true, it waits for completion and returns a pass/fail decision plus artifact links.
{
"base_url": "https://preview.example.com",
"preset": "fast",
"fail_on": "fetch_errors,non200_status,schema_missing_required,placeholder_hits",
"max_issue_rate": 10,
"wait": true,
"timeout_seconds": 180
}
Response (wait=true) includes:
pass (boolean)reason (string)failing (object: failing keys and details)report_url and json_url (links; may be relative)summary_markdown_url (link to a PR-comment-ready Markdown summary)If waiting times out, this endpoint can return 202 with a running status. In that case, keep polling using the returned status_url and fetch artifacts when complete.
Return a Markdown summary suitable for GitHub PR comments. Use the URL returned as summary_markdown_url from /validate to keep presets and thresholds consistent.
Export normalized findings as JSON for downstream tooling.
Export normalized findings as CSV.
List recent incidents detected by monitoring.
List template identifiers detected for a monitored site. This is useful for building links to the drift timeline (and is used by the dashboard’s template autocomplete).
{
"templates": [
"/product/*",
"/collections/*"
]
}
Templates appear after at least one monitoring scan has run for the given base_url.
List drift timeline points for a given base URL and template identifier. The template value should match one of the entries returned by /api/v1/templates.
List API key audit events.
Dashboard aggregate endpoint for a project. Returns project summary cards, recent scans, and gsc payload for Search Console widgets.
List custom extraction rules for a site.
Create or update a custom extraction rule (Pro required).
{
"field_name": "price",
"selector_type": "css",
"selector": ".product-price",
"expected_type": "number",
"required": true
}
Delete one extraction rule by field name (Pro required).
Dry-run a rule against sampled pages before saving (Pro required).
{
"base_url": "https://example.com",
"rule": {
"field_name": "price",
"selector_type": "css",
"selector": ".product-price",
"expected_type": "number",
"required": true
}
}
Start Google Search Console OAuth for a site (Pro + GSC integration configured). Returns an auth_url to redirect the user.
List available/selected Search Console properties for a connected site.
Set the selected Search Console property for a site.
{
"base_url": "https://example.com",
"property": "sc-domain:example.com"
}
Trigger a fresh Search Console data sync for a site.
{
"base_url": "https://example.com"
}
Start a deep crawl job (Pro/Enterprise depending on crawl_scope). Returns job_id, status_url, and report links.
{
"base_url": "https://example.com",
"crawl_scope": "deep_audit",
"max_pages": 500,
"render_js": false,
"respect_robots": true,
"crawl_speed": "normal",
"include_patterns": [],
"exclude_patterns": []
}
List deep-audit jobs for the authenticated account.
Get deep-audit job status, progress, and metadata.
Get deep-audit HTML report (job must be complete).
Get raw deep-audit JSON result (job must be complete).
Get template internal-link graph payload used by the app graph view.
Get URL-level internal PageRank rows and summary for the deep-audit job.
Get full audit aggregate payload for enterprise-style views.
Legacy alias that redirects to /api/v1/deep-audit/{job_id}/graph.
Legacy alias that redirects to /api/v1/deep-audit/{job_id}/url-pagerank.
Legacy alias that redirects to /api/v1/deep-audit/{job_id}/full-audit.
wait=true, SEODiff returns 200 for pass and 409 for fail (and still includes pass in the JSON body).Errors typically return JSON shaped like:
{
"error": "..."
}
Quota and site limits may return 429. Invalid input returns 400. Plan-gated features may return 403. Missing/invalid auth returns 401.
The dashboard and automation are clients of the API. This keeps behavior consistent across monitoring and CI/CD, and allows SEODiff to evolve heuristics without changing your integration surface.