Compare two SEO audits: before/after or site vs site (free)
web_compare_snapshotsCompare two SEO and AI-readiness snapshots to spot score changes, new or resolved issues, and field updates—ideal for tracking regressions, verifying fixes, or checking competitors.
Instructions
Diff two SEO/AI-readiness snapshots field by field: score deltas, issues added/resolved, and changes to title, meta description, canonical, H1s, JSON-LD types, Open Graph, technologies, AI-bot access, llms.txt, sitemap, status and more. Three modes: (1) before + after = two snapshot objects you saved earlier from web_seo_audit (or site rows from web_batch_audit) - no fetching; (2) before + url = historical follow-up: re-audits url now and compares with the saved snapshot; (3) url + compareUrl = audits two live URLs (e.g. competitor vs own site, staging vs production). WHEN TO USE: track SEO regressions/improvements over time, verify a fix, compare competitors. Fetches like web_seo_audit (live modes only). RETURNS: {summary{before_url, after_url, before_checked_at, after_checked_at, seo_score_before, seo_score_after, seo_score_delta, ai_readiness_score_delta, issues_added, issues_resolved, changed_fields}, changes[{type:"change", field, before, after, delta?, added?, removed?} | {type:"issue_added"|"issue_resolved", code}], before, after (only fetched snapshots are echoed)}. Errors: INVALID_ARGUMENTS (wrong mode combination) plus INVALID_URL, BLOCKED_PRIVATE_ADDRESS, DNS_FAILED, FETCH_FAILED, TIMEOUT, TOO_MANY_REDIRECTS. WHEN NOT TO USE: for a single audit without comparison use web_seo_audit. COST: free (local fetches, no APIFY_TOKEN). PARAMETERS: exactly one of three combinations is accepted, any other combination (including all four or a single field) returns INVALID_ARGUMENTS without fetching: {before, after} | {before, url} | {url, compareUrl}. before/after must be whole snapshot objects as returned (type "seo_audit" from web_seo_audit, or a "site" row from web_batch_audit) - pass them unmodified; missing fields are compared as null. In {before, url} the live side is re-audited with checkRobots=true, so compare it only with a snapshot also taken with checkRobots=true. In {url, compareUrl} url is the "before" side and compareUrl the "after" side, so seo_score_delta = compareUrl score minus url score. url and compareUrl follow the same rules as web_seo_audit url (bare domain -> https, exact page). EXAMPLE: {"url":"mysite.com","compareUrl":"competitor.com"} -> {summary:{seo_score_delta, issues_added, ...}, changes:[...]}
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Optional; used with before or compareUrl. Public domain or http(s) URL audited live: the "after" side (with before) or the "before" side (with compareUrl). Example: "mysite.com" | |
| after | No | Optional; used only with before. Later snapshot object of the same shape to compare against before | |
| before | No | Optional; used with after or url. Earlier snapshot object, unmodified output of web_seo_audit (type "seo_audit") or a web_batch_audit "site" row. Example: {"type":"seo_audit","final_url":"https://example.com/","seo_score":72,...} | |
| compareUrl | No | Optional; used only with url. Second public domain or http(s) URL audited live as the "after" side. Example: "competitor.com" |