ScreenshotNeo

BlogHow-to

How to Capture Screenshots of Competitor Rankings for Non-Branded Keywords

Capture competitor results for a defined query, location, device, and time. Learn what screenshots can prove, how to repeat them, and where Search Console fits.

By the ScreenshotNeo team4 October 202610 min read

A screenshot can document how a competitor appeared on a search results page for a particular query, place, device, and time. It is evidence of that observed page, not a permanent or universal ranking record. To make captures comparable, record the exact non-branded query and search context with every image. Search Console can segment performance data for your own property when eligible, but it does not show a competitor’s exact live ranking.

1. Define the non-branded query

“Non-branded” is relative to the site or brand being analyzed. Google describes a non-branded query as one that does not include the brand name. Its branded classification can include misspellings and unique products or services associated with a brand, and Google says the AI-assisted classification can occasionally be wrong. Review the definitions and limitations in Google Search Console’s guide to the branded and non-branded query filter and Google’s announcement.

Write down the query exactly as you intend to search it. For example, “accounting software for freelancers” may be non-branded for one company, while a query naming a competitor’s product is branded in relation to that competitor. If you are comparing several businesses, state whose brand the classification is relative to. Do not assume that a generic-looking query will always be classified the same way by Google’s filter.

2. Fix the search context

Search results can vary by time, place, device, and recent search history. Record these details before capturing so another person can understand what the screenshot represents. Google discusses these variables in its Search results Performance report overview.

  • Query: exact text, including spelling and punctuation.
  • Location: country, region, city, or local search area relevant to the comparison.
  • Device: desktop or mobile, and ideally the viewport or device preset if using a capture tool.
  • Date and time: include a time zone; use a consistent schedule for repeated observations.
  • Search type: web, image, video, or another result type. Do not compare different types as if they were the same search.
  • Search state: note whether you were signed in and whether you used a fresh or established browser profile. Recent search history can affect what appears.

For a manual observation, set the location and device context as consistently as your search workflow permits, then run the query. A screenshot only captures the rendered result page. It does not establish that every searcher in that place or on that device would see the same results.

3. Capture the results page and preserve its context

  1. Run the exact query under the context you recorded.
  2. Capture enough of the page to identify the query and the competitor result. Include the visible result title, domain or URL, and nearby features such as ads, local packs, or other result modules when practical.
  3. Save the screenshot as an image, then store the query and context in the filename, a report row, or a companion record.
  4. Repeat later using the same query, place, device, search type, and process. If any variable changes, record that change rather than treating the images as directly equivalent.

A filename pattern such as 2026-10-04_1430-UTC_accounting-software-freelancers_city-mobile.png can make a file identifiable. Keep a separate capture log if queries or contexts are too long for filenames. Do not use a filename alone as a substitute for noting the actual search state.

4. Use a browser script for repeatable captures

For a one-off screenshot, the browser’s built-in screenshot function may be enough. For repeat runs, browser automation can set a viewport, navigate to a search URL, wait for the page, and save an image. The following Playwright example uses a search URL and saves the rendered page. It does not set a reliable Google location by itself; use a search setup appropriate to your target locale, and record the resulting context. Respect the search engine’s terms and access controls, and do not attempt to bypass a CAPTCHA or bot check.

npm install playwright
npx playwright install chromium
// capture-serp.mjs
import { chromium } from 'playwright';

const query = process.argv.slice(2).join(' ') || 'accounting software for freelancers';
const searchUrl = new URL('https://www.google.com/search');
searchUrl.searchParams.set('q', query);

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

try {
  await page.goto(searchUrl.toString(), { waitUntil: 'domcontentloaded', timeout: 45000 });
  await page.locator('body').waitFor({ state: 'visible', timeout: 15000 });
  await page.screenshot({ path: 'serp.png', fullPage: true });
  console.log(`Saved serp.png for query: ${query}`);
} finally {
  await browser.close();
}
node capture-serp.mjs "accounting software for freelancers"

The script pins viewport, locale, and timezone settings, but these are not a guarantee of a particular geographic search result. Add a controlled location workflow if your comparison requires city-level results, and include that method in the capture log. A full-page image can be useful for documenting results below the fold; for a concise evidence record, a viewport capture may be easier to review. Capture the query and surrounding result features visibly where possible, or retain them in the associated record.

cURL, Python, and Node.js with ScreenshotNeo

If you need an image from a URL through an API rather than managing a browser installation, ScreenshotNeo accepts a URL in one GET request. Its documentation describes the API parameters. These examples capture a search URL as an image; they do not configure or guarantee Google location-specific results, so establish the desired search context separately.

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

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

5. Interpret Search Console data correctly

For your own site, open the Search Console Search results Performance report and use the branded or non-branded query filter if it is available for your property. The report can show your property’s queries and metrics such as clicks, impressions, click-through rate, and average position. The filter is unavailable for sub-properties such as a directory property and may be unavailable for sites with low impression volume. Google’s documentation says the filter provides data starting from its introduction on March 11, 2025; its announcement says it became available to all eligible sites on March 11, 2026.

Search Console does not report a competitor’s exact live position. Average position is an aggregate over the selected grouping and period: Google describes it in terms of the average topmost position for results from your property. It is not the position of a particular result in the screenshot, nor should it be interpreted as a competitor’s rank. Google recommends focusing on trends in clicks and impressions rather than position alone. See the report overview and common tasks and use cases.

6. Build a useful comparison record

Keep the screenshot and its metadata together. A simple log can use these fields:

Field Example
Query accounting software for freelancers
Brand context Non-branded relative to the site being analyzed
Search location Target city and country, plus how location was set
Device and viewport Mobile, named preset or viewport dimensions
Search type Web
Timestamp Date, time, and timezone
Search state Signed-in state and profile/history notes
Observed result Competitor domain, visible title, and relevant result module
Image reference Filename or stored artifact identifier

When tracking repeatedly, decide the capture frequency, result depth, and retention period based on the decision you need to make. For a recurring monitoring workflow, compare tools on location and device controls, capture frequency, stored result depth, visual snapshot retention, and export options. These criteria complement screenshots; a rank tracker’s number alone does not preserve the exact visual context of a result page.

7. Screenshot options that help preserve evidence

Choose the smallest capture configuration that answers the question. A viewport screenshot shows what fits on screen; a full-page capture includes results farther down. For mobile comparisons, use a mobile viewport or device preset rather than shrinking a desktop screenshot after capture. A selector capture can isolate a specific result when you know the page structure, but it may omit surrounding context needed to interpret the result. Custom waits can help when the page is still rendering; excessively long delays slow repeated captures.

ScreenshotNeo supports full-page capture with lazy images loaded, CSS-selector element capture, dark mode, 12 device presets and custom viewports, retina scale, PDF output, custom CSS and JavaScript, click-before-capture, selector hiding, waits for a selector, delay or network idle, request and resource blocking, custom headers, cookies, user agent, authorization, timezone and geolocation, transparent backgrounds, resizing, cache TTL, signed links, asynchronous jobs with signed webhooks, bulk capture of up to 100 URLs per call, a usage API, and an OpenAPI spec. Use only options relevant to the capture; changing context or hiding page elements can make a screenshot less representative of what a searcher saw. Its parameters also support names used by other screenshot APIs, which can simplify switching.

8. Or skip the browser setup

ScreenshotNeo is a website screenshot API and MCP server from ScreenshotNeo. A single GET request returns a PNG, JPEG, WebP, or PDF. To capture a search URL, replace the example target with the exact URL you want to document:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo API documentation for configuration and parameters. Before capture, ScreenshotNeo accepts cookie or consent banners as a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each step can be turned off. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing, and the response identifies the page verdict and billing status in headers. Its MCP server gives AI agents tools named take_screenshot, get_page_info, and capture_pdf. The Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots. Use the free ScreenshotNeo sign-up to get started.

9. Troubleshooting

Problem Likely cause What to do
The same query shows a different result order later Time, location, device, search history, or other search context changed. Compare the recorded contexts first. Repeat with the same query and controlled settings; describe the image as a dated observation.
A result appears in a screenshot but not in Search Console Search Console is property-level performance reporting, not a log of every live SERP or competitors’ positions. Use the screenshot for the observed competitor appearance. Use Search Console for eligible data about your own property.
The branded/non-branded filter is missing The property may be a sub-property or have too little impression volume. Check the property type and eligibility notes in Google’s filter documentation. Continue with query review and do not infer that the filter is available for every property.
A query seems misclassified Google’s classification can include misspellings and brand-associated products or services, and may occasionally be wrong. Review the query in context and treat the filter as a classification aid, not an infallible label.
The automated browser capture times out The search page did not reach the chosen readiness condition within the timeout, or access was challenged. Use a reasonable navigation timeout, wait for a stable page element, and inspect the result. Do not try to bypass a CAPTCHA or bot check.
The captured page is blank or incomplete Navigation may have failed, content may still be loading, or the requested page may have returned an error. Check the URL and response in the browser, wait for the relevant content, and retry only when appropriate. Record failures instead of presenting them as ranking evidence.
The API response is not an image The request may have failed or returned a page verdict/error rather than the expected capture. Check the HTTP response and ScreenshotNeo response headers, confirm the access key and URL, and consult the API documentation.

10. Performance, reliability, and cost

A single manual screenshot has little setup cost, while repeatable browser automation adds browser installation, execution time, and maintenance when page behavior changes. Keep the viewport and wait condition stable and avoid arbitrary long delays. Capture only the page depth and output format needed for review. For recurring workloads, schedule captures at a cadence that answers a real comparison question, and retain images with their context so a later review is possible.

Search observations are inherently time-bound. A screenshot can preserve what one capture process saw, but it cannot guarantee what every searcher saw or prove a stable rank. For reliability, record failed or challenged captures, keep timestamps, and avoid comparing records with different contexts as if they were controlled observations. Search Console’s average position and a visual screenshot measure different things.

ScreenshotNeo pricing is Free for 1,000 shots per month with no card, Starter $5 for 3,000, Growth $15 for 15,000, Pro $39 for 60,000, Scale $99 for 250,000, and Business $249 for 1,000,000; yearly billing gives two months free. Every feature is available on every plan. Only clean shots are billed, so bot checks/CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not charged. Choose a plan based on expected successful captures and verify usage with the usage API.

Frequently asked questions

Can I prove a competitor ranks at a fixed position with a screenshot?

You can document the position visible in one captured result page under recorded conditions. You cannot use that image to establish a permanent rank across locations, devices, or times.

How do I track non-branded keywords?

For your own property, use Search Console’s branded or non-branded filter when eligible and review queries and performance trends. For competitor observations, define the query relative to the brand being analyzed and keep repeat captures consistent.

Why does my Google ranking look different by location or device?

Google says results can vary by place, device, time, and recent search history. Record those inputs and compare like with like.

Does Search Console show competitor rankings?

No. Its Search results report describes performance for your property. It does not provide competitors’ exact live positions.