Features Full Page Screenshot Wait for Selector & Delay Block Cookie Banners Custom Viewport & Device Website to PDF HTML to Image Dark Mode Image Format & Quality MCP Server Pricing Docs Blog Log In Sign Up

Automate Visual SEO Audits with a Screenshot API

An SEO audit without visual proof is half the story. Crawlers like Screaming Frog tell you a page has a missing H1 or a broken canonical tag, but they can't show you that the hero section renders as a white rectangle on mobile, or that a cookie consent popup covers 60% of the viewport. An SEO audit screenshot API fills that gap by capturing every page on your site exactly as a browser renders it, at any viewport, on any device.

The Problem with Spreadsheet-Only SEO Audits

Most technical SEO audits end up as spreadsheets. Screaming Frog exports a CSV with hundreds of rows: status codes, canonical URLs, meta descriptions, heading counts. SEMrush and Ahrefs generate similar data in their site audit modules. The data is accurate. The problem is that nobody on the client's team reads a 2,000-row spreadsheet and actually understands what's wrong.

Visual evidence changes that. When you show a client that their checkout page renders with overlapping text on a 375px screen, they get it immediately. When you put a before-and-after screenshot of their homepage next to each other, the $5,000 audit fee makes sense. But capturing those screenshots manually is brutal. Open Chrome, resize the window, navigate, screenshot, paste into a deck, repeat. For a site with 500 indexed pages, taking bulk website screenshots for SEO manually means spending days on captures alone.

Agencies that charge $2,500 to $5,000 per audit often spend five or more hours on the visual reporting alone. That's time not spent on the actual analysis. Automated SEO audit screenshots reduce those hours to minutes: feed in a list of URLs, specify viewports and device types, and get full-page captures back as images or PDFs.

Mobile vs Desktop Rendering Verification

Google switched to mobile-first indexing years ago, and most SEOs still only spot-check mobile rendering. Open a URL in Chrome DevTools, toggle the device toolbar, squint at the result, move on to the next page. This works for 5 pages. It falls apart at 50. At 500, it's impossible.

A screenshot API for SEO testing lets you capture the same URL at multiple viewports in a single script. Compare desktop (1440px) and mobile (375px) renders side by side, and flag pages where the mobile version breaks: text clipped by overflow, images stretched beyond the container, navigation menus that fail to collapse, or entire sections hidden by a broken media query.

curl "https://api.screenshotrun.com/v1/screenshots/capture?url=https://example.com/landing&device=mobile&full_page=true&block_cookies=true&format=png" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -o landing-mobile.png

Set device=mobile to get a realistic phone viewport with proper user agent and touch emulation. For tablet testing, switch to device=tablet. The custom viewport feature gives you exact control over width and height if you need non-standard dimensions. You can also toggle dark mode to verify that your pages render correctly in both light and dark themes.

Run the same script with device=desktop and you have a pair of screenshots to compare. After a site redesign or migration, this pair tells you instantly which pages broke on mobile. No DevTools clicking, no manual resizing.

Extracting Metadata Alongside Screenshots

One thing that separates a website audit API from a basic browser extension: you can pull structured metadata in the same request. The extract_metadata parameter returns the page title, meta description, canonical URL, OG image, and other head elements alongside the screenshot.

This matters for visual SEO audits because visual issues and metadata issues often appear on the same page. A product page with a missing OG image probably also has a generic meta description. Instead of running two tools (crawler for metadata, screenshot tool for visuals), one API call gives you both. For pages where the OG image itself needs verification, you can capture the og:image URL directly and compare it across your site, similar to how the OG image generator workflow handles social preview validation.

The Node.js example below crawls a list of URLs, captures mobile screenshots, and extracts metadata for each page. Pages with missing titles or descriptions get flagged automatically.

const https = require('https');
const fs = require('fs');
const path = require('path');

const API_KEY = process.env.SCREENSHOTRUN_API_KEY;
const urls = [
  'https://example.com/',
  'https://example.com/products',
  'https://example.com/about',
  'https://example.com/contact'
];

async function auditPage(url) {
  const params = new URLSearchParams({
    url,
    device: 'mobile',
    full_page: 'true',
    block_cookies: 'true',
    block_ads: 'true',
    extract_metadata: 'true',
    format: 'png',
  });

  const endpoint = `https://api.screenshotrun.com/v1/screenshots/capture?${params}`;

  return new Promise((resolve, reject) => {
    https.get(endpoint, { headers: { 'Authorization': `Bearer ${API_KEY}` } }, (res) => {
      const metadata = res.headers['x-metadata']
        ? JSON.parse(res.headers['x-metadata'])
        : null;

      const slug = new URL(url).pathname.replace(/\//g, '_') || 'home';
      const dir = path.join('audit-results', slug);
      fs.mkdirSync(dir, { recursive: true });

      const imgPath = path.join(dir, 'mobile.png');
      const file = fs.createWriteStream(imgPath);
      res.pipe(file);

      file.on('finish', () => {
        file.close();
        if (metadata) {
          fs.writeFileSync(
            path.join(dir, 'metadata.json'),
            JSON.stringify(metadata, null, 2)
          );
          if (!metadata.title) console.warn(`MISSING TITLE: ${url}`);
          if (!metadata.description) console.warn(`MISSING DESCRIPTION: ${url}`);
          if (!metadata.og_image) console.warn(`MISSING OG IMAGE: ${url}`);
        }
        console.log(`Audited: ${url}`);
        resolve({ url, metadata, imgPath });
      });
    }).on('error', reject);
  });
}

async function run() {
  for (const url of urls) {
    await auditPage(url);
  }
  console.log('Audit complete. Check audit-results/ for screenshots and metadata.');
}

run();

After the script finishes, you have a folder per URL containing the mobile screenshot and a JSON file with all meta tags. Grep the JSON files for missing fields and you have an instant audit checklist without ever opening a browser manually.

Cleaning Up Cookie Banners and Chat Widgets

Nothing ruins an audit screenshot faster than a cookie consent popup covering the entire first fold. GDPR-heavy sites produce the most disruptive consent flows: banners that require four clicks to dismiss, dark patterns that make "Reject All" nearly invisible, overlays that block the page content entirely.

For SEO audits, you want to see the page as Google sees it, and Google doesn't accept cookies. The cookie blocking parameter strips consent banners before capture. Pair it with block_ads and block_chats to remove ad overlays and live chat widgets too. If a specific popup still slips through, hide_selectors lets you target it by CSS selector.

Flip side: you might want to audit the cookie banner itself.

Google penalizes intrusive interstitials on mobile. Capture the page once with block_cookies=true (clean view) and once without (banner visible). The two screenshots side by side show exactly how much screen space the consent popup consumes on a phone screen. This is a quick win in any audit report because clients can see the problem without any technical explanation.

Visual SEO Audit Evidence for Client Reports

SEO agencies live and die by client deliverables. The audit report needs to justify the fee, and "we fixed 47 canonical tags" doesn't land the same way as showing the actual fix. Screenshot pairs (before and after) are the strongest proof of work in an audit report.

Capture every problem page before you start fixing anything. Store the screenshots with timestamps and organize by issue type: rendering problems in one folder, metadata issues in another, mobile breakages in a third. After deploying fixes, capture again. The visual diff between the two versions is self-explanatory, and it turns a technical audit into something a marketing director can present to their CEO.

You can also use CSS injection to annotate problem areas directly on the screenshot. The css parameter lets you inject custom styles that highlight missing elements, outline heading hierarchy, or flag images without alt text. Inject a red border around empty H1 tags, add a yellow background to images missing alt attributes, or outline the canonical link element. This turns a plain screenshot into an annotated audit artifact that speaks for itself.

Site migrations are where before-and-after pairs pay off the most. A domain move or CMS swap affects hundreds of pages simultaneously. Capture the full site before migration, run the migration, then capture again. Any page where the layout shifted, content disappeared, or JavaScript failed to render shows up immediately in the comparison. Without visual evidence, migration bugs often go unnoticed for weeks until traffic drops force an investigation.

The same approach in Python for teams that prefer it:

import requests
import os
import json
from urllib.parse import urlparse

API_KEY = os.environ['SCREENSHOTRUN_API_KEY']

urls = [
    'https://example.com/',
    'https://example.com/products',
    'https://example.com/pricing',
    'https://example.com/blog',
]

issues = []

for url in urls:
    response = requests.get(
        'https://api.screenshotrun.com/v1/screenshots/capture',
        headers={'Authorization': f'Bearer {API_KEY}'},
        params={
            'url': url,
            'device': 'mobile',
            'full_page': 'true',
            'block_cookies': 'true',
            'block_ads': 'true',
            'extract_metadata': 'true',
            'format': 'png',
        }
    )

    slug = urlparse(url).path.strip('/').replace('/', '_') or 'home'
    folder = os.path.join('audit', slug)
    os.makedirs(folder, exist_ok=True)

    with open(os.path.join(folder, 'mobile.png'), 'wb') as f:
        f.write(response.content)

    meta = response.headers.get('X-Metadata')
    if meta:
        data = json.loads(meta)
        with open(os.path.join(folder, 'meta.json'), 'w') as f:
            json.dump(data, f, indent=2)

        if not data.get('title'):
            issues.append(f'{url} - missing title tag')
        if not data.get('og_image'):
            issues.append(f'{url} - missing OG image')

    print(f'Done: {url}')

if issues:
    print(f'\n{len(issues)} issues found:')
    for issue in issues:
        print(f'  - {issue}')
else:
    print('\nNo metadata issues detected.')

SERP Snippet Monitoring with a Screenshot API

Title tag rewrites are one of Google's more frustrating habits. You write a carefully crafted title, and Google replaces it with something pulled from the page content or an anchor text. The only way to catch this is to look at the actual search results page.

Pass a Google search URL to the API with different geolocation settings to see how your snippets appear across countries. Enable stealth mode to avoid bot detection on search pages. The captures show you the real title Google displays, the actual meta description (or the one Google chose to show), and whether your rich snippets render correctly. This is essentially a SERP screenshot API built into your existing audit workflow.

Local SEO audits benefit from this too. A business with locations in Chicago and Miami needs to verify that each location page appears correctly in local search results. Capture the SERP from each city's geolocation and compare. If your client's Google Business listing shows outdated information or a competitor is outranking them in a specific metro area, the screenshot makes it visible. For more on geolocation-based captures, see the competitor monitoring guide.

Featured snippets and knowledge panels deserve attention too. If your client's content holds a featured snippet position, scheduled captures verify that it stays in place. When a competitor takes over the snippet, the screenshot archive shows exactly when the shift happened.

Scheduling Recurring SEO Audits

A one-time audit catches today's problems. Recurring audits catch regressions before they affect rankings. Set up a cron job or a CI/CD trigger that runs your audit script weekly or after every deployment. Each run captures fresh screenshots and metadata, and you compare them against the previous batch.

The cache_ttl parameter matters here. Disable caching with cache_ttl=0 so every audit run captures the page as it looks right now, not a stored version from yesterday. For async processing of large URL lists, use webhook_url to receive a callback when each capture finishes rather than waiting for synchronous responses. This keeps your audit pipeline non-blocking, which is important when you're processing hundreds of URLs.

SEO monitoring screenshots on a schedule also catch third-party problems that traditional crawlers miss. A CDN misconfiguration that serves blank pages for 12 hours, a chatbot script that breaks the layout every other Tuesday, an A/B testing tool that accidentally hides the main content on 30% of page loads. These intermittent issues only surface when you capture frequently enough to hit the bad state. Weekly screenshots catch weekly problems. Daily captures catch daily ones.

Connect the audit output to Slack, email, or your project management tool. When the script detects a new missing title tag or a layout that changed since the last run, fire off a notification. The website change monitoring guide covers pixel-diff techniques for automated comparison.

Manual Screenshots vs SEO Audit Screenshot API

FactorManual (Chrome DevTools)Screenshot API
Pages per hour10-15 (with viewport switching)500+ (batch API calls)
Mobile emulationBrowser toggle, inconsistentStandardized device profiles
Cookie banner handlingClick dismiss every timeblock_cookies parameter
Metadata extractionSeparate crawl neededSame request via extract_metadata
ReproducibilityVaries by machine, browser, extensionsIdentical conditions every capture
Historical archiveManual file managementAutomated timestamped storage
Client report integrationCopy-paste into slidesProgrammatic PDF/image generation
Cost for 500-page audit5+ hours of manual laborA few dollars in API credits

SEO Audit Screenshot API Parameters

ParameterRole in SEO auditing
urlPage to audit (or a Google SERP URL for snippet checks)
deviceSwitch between desktop, mobile, tablet for responsive audits
full_pageCapture below-the-fold content, lazy-loaded sections
extract_metadataPull title, description, canonical, OG tags in one call
block_cookiesRemove consent banners for clean audit captures
block_adsStrip ad placements that obscure page content
block_chatsHide live chat widgets from captures
hide_selectorsTarget specific popups or overlays by CSS selector
cssInject styles to highlight missing H1s, outline headings, flag alt-less images
geolocationVerify SERP appearance and localized content per region
stealthBypass bot detection when capturing SERP pages
wait_for_selectorWait for JS-rendered content before capture
cache_ttlSet to 0 for fresh captures on every audit run
webhook_urlGet notified when batch audit captures finish
formatPNG for crisp text in reports, PDF for direct client deliverables

Run Your First Visual SEO Audit

Get 200 Free Screenshots

Visual evidence turns an SEO audit from a spreadsheet exercise into a compelling narrative. An SEO audit screenshot API gives you that capture infrastructure so you can focus on analysis and recommendations, not on resizing browser windows. For teams already running website change monitoring, adding SEO monitoring screenshots is a matter of adjusting the URL list and parameters. If you need to compare how pages render with self-hosted tools, the Puppeteer vs screenshot API comparison covers the trade-offs. And for ongoing regression detection between audits, pair scheduled captures with visual regression testing to catch rendering problems before they affect rankings.

Frequently asked questions

Crawlers analyze HTML source code, but they cannot see how a page actually renders in a browser. A screenshot API captures the visual output, revealing broken layouts, overlapping text on mobile, cookie banners covering content, missing hero images, JavaScript rendering failures, and elements hidden by broken CSS media queries. These visual problems directly affect user experience and can hurt rankings, but they are invisible to traditional crawling tools like Screaming Frog or Ahrefs.
Export your sitemap URLs into a script (Node.js, Python, or any language that can make HTTP requests). Loop through each URL, calling the ScreenshotRun API with parameters like device=mobile, full_page=true, and extract_metadata=true. For large batches, use the webhook_url parameter so the API sends a callback when each capture finishes instead of blocking your script. Store results in timestamped folders for easy before-and-after comparison.
Yes. Pass a Google search URL to the API with the stealth parameter enabled to avoid bot detection. Use the geolocation parameter to see how your snippets appear in different countries or cities. This lets you catch Google title tag rewrites, verify rich snippet rendering, and monitor featured snippet positions over time.
Before-and-after screenshot pairs visually prove the work done during an audit. Instead of telling a client you fixed 47 canonical tags, you show them the actual rendering improvement. Use the css parameter to inject styles that highlight problem areas (red borders around missing H1s, yellow backgrounds on images without alt text). Export captures as PNG for slide decks or PDF for formal deliverables.
Puppeteer requires you to install and manage Chromium on your own servers, handle memory leaks, browser crashes, and proxy rotation. A screenshot API handles all of that infrastructure: you send one HTTP request with your URL and parameters, and get back a screenshot. For SEO audits involving hundreds of pages across multiple viewports, the API approach saves significant development and maintenance time. See the full comparison at /compare/puppeteer-vs-screenshot-api.