ScreenshotNeo

BlogGuides

Why Do SERP Screenshots Have Different Results on Repeated Runs?

Repeated SERP screenshots can differ because of time, location, language, device, personalization, or capture method. Here’s how to compare them reliably.

By the ScreenshotNeo team4 October 202610 min read

Short answer: SERP screenshots can show different results on repeated runs because the search index and ranking systems change over time, and because search context—such as location, language, device, settings, and personalization—can affect the results or their order. A screenshot is a record of one search under particular conditions, not a universal ranking. Google documents these causes for Google Search; do not assume every search engine or capture service behaves the same way.

To find out what changed, compare the query, time, search context, result URLs and positions, visible result modules, and collection method. A visual difference alone does not prove that an organic ranking changed.

1. Why repeated SERP screenshots differ

Search results change over time

Google says newly published content can affect results even when searches happen only minutes or hours apart. Ranking improvements can also take time to roll out to all data centers, so the responding data center may be another source of variation. These are possible explanations, not a diagnosis of any particular pair of screenshots. Google explains why search results differ.

Location, language, device, and settings change the context

Google identifies location, language, and device type as contextual inputs. For example, a location-sensitive query may show nearby options, while a device can affect which links or screen-appropriate results appear. Google also describes query words, relevance, page usability, source expertise, location, and settings among the factors Search uses. The weight of ranking factors varies with the query. Google’s ranking overview explains these factors.

Personalization can affect some results

Google says account information, including Search history, may personalize results. Personalization can reorder individual results or content blocks, but it does not affect every result. Turning personalization off does not remove other context, such as location, language, and device. Where Google provides it, use the “Try without” option to compare a non-personalized view.

A 2017 study reported personalization-attributed differences in an average of 11.7% of Google results and 15.8% of Bing results in its observations. Those figures are historical and specific to that study’s methods; they are not current prevalence estimates. The study also found that differences varied by query and ranking position. Hannak et al. (2017).

Search evolves through experiments and improvements

Google describes ongoing experiments and system improvements. Its published 2023 evaluation figures include more than 700,000 experiments and over 4,000 improvements to Search; Google says live experiments begin with a small share of users, usually starting at 0.1%. These counts show that Search is actively evaluated; they do not establish that an experiment caused a particular screenshot difference. Google’s Search evaluation overview and ranking systems guide.

2. Diagnose the difference systematically

  1. Confirm the exact query. Preserve spelling, punctuation, operators, and any explicit search settings.
  2. Record when each search ran. Include the date, time, and time zone. A delay of minutes or hours can matter.
  3. Record the search context. Note search engine, location or configured city, language, device class, signed-in state, personalization state, and observable settings.
  4. Record how each result was collected. Distinguish a manual browser search from a rank tracker, automated browser, or screenshot API. Different collection methods are not established as equivalent.
  5. Compare results separately from appearance. Record result URLs and positions, then note modules or blocks, such as maps or other visible features, and any layout changes.
  6. Check whether the difference persists. Take dated observations over several days before concluding that a ranking trend exists.
What changed? What to check What you can conclude
A result URL or organic position Query, time, context, and repeated observations The observed result or position changed under those conditions.
The order of result blocks Visible modules, personalization state, and page layout The screenshot layout changed; this alone does not establish an organic ranking change.
Only the visual rendering Viewport, device, loading state, and capture method The capture appearance differed; verify URLs and positions before calling it a ranking change.
Manual and tracker results disagree Tracker location, language, device, timing, and collection method The observations used different conditions; neither alone represents every user’s experience.

SE Ranking recommends matching city, device, and language settings and reviewing position history over several days rather than relying on a single check. That is practical guidance, not a guarantee that repeated output will match. SE Ranking’s guidance on differing ranking checks.

3. Capture comparable screenshots with a browser

For a controlled comparison, use the same browser setup, viewport, query, location, language, and sign-in or personalization state. Set these explicitly where your browser automation and search interface allow it. Save the capture timestamp and the settings alongside each screenshot. The example below is a local browser-capture template: it captures a page after navigation but does not force Google to return identical results or make a location setting valid.

Runnable Node.js example with Playwright

Install Playwright and its Chromium browser:

npm install playwright
npx playwright install chromium

Save as capture-serp.mjs, then run node capture-serp.mjs. Set SEARCH_URL to the search URL and query format you intend to observe. The example uses a fixed viewport and locale, waits for the page to load, and saves a full-page image.

import { chromium } from 'playwright';

const searchUrl = process.env.SEARCH_URL;
if (!searchUrl) {
  throw new Error('Set SEARCH_URL to the search results URL to capture.');
}

const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({
  viewport: { width: 1365, height: 900 },
  locale: 'en-US',
  timezoneId: 'UTC'
});
const page = await context.newPage();

try {
  await page.goto(searchUrl, { waitUntil: 'domcontentloaded', timeout: 60000 });
  await page.screenshot({ path: 'serp.png', fullPage: true });
  console.log(JSON.stringify({
    capturedAt: new Date().toISOString(),
    url: page.url(),
    viewport: page.viewportSize(),
    locale: 'en-US',
    timezoneId: 'UTC',
    screenshot: 'serp.png'
  }, null, 2));
} finally {
  await browser.close();
}

For a more comparable study, store the query and context metadata in a separate record for every run. Do not treat the browser locale as a substitute for setting a search engine’s language or location: these are distinct inputs. Authentication and personalization state may require a deliberate browser context or profile, and should be documented rather than assumed.

cURL, Python, and Node.js with ScreenshotNeo

These examples call ScreenshotNeo’s screenshot API for a search results URL you provide. They capture the requested page; they do not make search results identical between runs or control Google’s ranking context. See the ScreenshotNeo API documentation for request details.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://www.google.com/search?q=example -o serp.webp
import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={
        "access_key": "YOUR_API_KEY",
        "url": "https://www.google.com/search?q=example"
    },
    timeout=90
)
r.raise_for_status()
open("serp.webp", "wb").write(r.content)
const q = new URLSearchParams({
  access_key: 'YOUR_API_KEY',
  url: 'https://www.google.com/search?q=example'
});
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot request failed: ${res.status}`);
const image = Buffer.from(await res.arrayBuffer());
await import('node:fs/promises').then(fs => fs.writeFile('serp.webp', image));

4. Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server for developers, made by Yorker Media. A single GET request captures a URL as PNG, JPEG, WebP, or PDF. For SERP comparisons, keep the search URL and its context consistent and retain the response verdict and billing headers with your capture records. Learn more at ScreenshotNeo.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://www.google.com/search?q=example -o serp.webp

Cookie banners are accepted before capture and more than 60 known consent platforms, newsletter popups, and chat widgets are removed; each step can be turned off. Bot checks, blank pages, failed loads, timeouts, and cache hits are not billed, and responses report the page verdict and billing status. An MCP server provides take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000 screenshots. See the API documentation and sign up free for 1,000 screenshots a month, with no card.

5. Options for controlled captures

When your goal is consistent screenshot collection, configure the capture itself as well as recording the search context. ScreenshotNeo supports the following options; these can control how a page is captured, but they cannot freeze a search engine’s index, experiments, or personalized results.

Need Relevant capture options
Keep page geometry consistent 12 device presets or a custom viewport; retina scale; full-page capture; dark mode.
Capture a specific region Element capture by CSS selector; click an element before capture; hide selectors.
Wait for the page to settle Wait for a selector, a delay, or network idle; full-page capture loads lazy images.
Control page behavior or resources Custom CSS and JavaScript; custom headers, cookies, and user agent; block ads, trackers, requests, or resource types.
Set a capture environment Timezone and geolocation. These affect page context where relevant; they do not guarantee a search engine uses the same ranking location or language.
Store and distribute captures PNG, JPEG, or WebP output; resizing; caching with a chosen TTL; signed links for public image tags; asynchronous jobs with signed webhooks; bulk capture of up to 100 URLs per call; usage API and OpenAPI spec.

ScreenshotNeo also supports PDF output with paper size, margins, landscape orientation, and page ranges; HTML or CSS to image; custom authorization; transparent backgrounds; and parameter names used by other screenshot APIs to make migration easier. Check the documentation for the supported request parameters and current usage guidance.

6. Troubleshooting repeated-run comparisons

Symptom Likely cause What to do
Same query, different result URLs or order Elapsed time, changing content, data-center rollout, context, or personalization. Record timestamps and context, then compare a series of observations. Do not infer a lasting ranking change from two captures alone.
Local businesses or results differ Different location or location settings. Use and record the same configured location. Remember that location can remain relevant even when personalization is off.
Desktop and mobile screenshots differ Device and viewport affect the search experience and page layout. Keep device class and viewport consistent; compare result URLs and positions separately from layout.
Language or regional results differ Different language, region, or search settings. Record the search language and settings explicitly. A browser locale alone does not prove the search used the same language context.
Manual browser and automated capture disagree Collection method, timing, cookies, sign-in state, or configured environment differs. Document each method and context. The available evidence does not establish that a tracker, browser, and capture API return equivalent results.
Screenshot layout differs but URLs do not Changed content blocks, page rendering, viewport, or loading state. Inspect modules and visual layout separately. Do not label it an organic position change without URL or position evidence.
Automated capture is blank or incomplete Navigation timed out, content was still loading, or the page required a later wait condition. Use an appropriate wait condition, check the final URL, and inspect the capture verdict. For a browser script, increase the navigation timeout only when slow navigation is expected.
Two runs appear identical because of caching The capture pipeline reused a cached response. Check whether caching is enabled and its TTL; configure the capture according to the API documentation when a fresh page capture is required. A fresh capture still does not guarantee identical search results.

7. Performance, reliability, and cost

For meaningful ranking comparisons, a series of dated observations is more useful than repeatedly capturing the same page in a short burst. Capture only the pages and fields needed, and keep context metadata with the images so that differences remain interpretable. A screenshot service can simplify capture and batch work; it cannot make Search static.

Browser automation requires maintaining a browser runtime and handling navigation waits, browser resources, and storage. A screenshot API moves the browser-capture request behind an HTTP call. With ScreenshotNeo, cache TTLs, async jobs, bulk capture, and usage reporting can support larger workflows. Cache hits are not billed; bot checks, blank pages, timeouts, failed loads, and cache hits cost nothing. ScreenshotNeo’s stated monthly plans are Free: 1,000 shots; Starter: $5 for 3,000; Growth: $15 for 15,000; Pro: $39 for 60,000; Scale: $99 for 250,000; Business: $249 for 1,000,000. Yearly billing gives two months free, and every feature is on every plan. These prices describe ScreenshotNeo plans and do not estimate the cost of other tools or the cost of search tracking.

8. FAQ

Does a different SERP screenshot prove my ranking changed?

No. It shows that the observed result or appearance differed. Check URLs and positions, control context, and review a sequence before drawing a ranking conclusion.

Will turning off Google personalization make every run match?

No. Google says personalization affects only some results, and other context—including location, language, and device—can still matter.

Should a rank tracker match what I see in my browser?

Not necessarily. Compare the configured location, device, language, timing, and collection method. The cited sources do not establish equivalence between tracker and personal-browser results.

How many screenshots should I compare?

There is no universal number that proves a ranking change. Preserve dated observations across several days and interpret the pattern alongside the context for each check.

Can a screenshot service make SERPs stable?

No capture service can guarantee that a search engine’s results stay fixed. It can make the capture setup more repeatable and preserve a visual record of what appeared at capture time.