How to Compare Google SERP Screenshots for India and the United States
Compare the same Google query across India and the US by controlling region, language, account, and capture conditions—and documenting what each screenshot can prove.
To compare Google Search results for India and the United States, keep the query and capture conditions consistent, set and verify each country service in Google Search settings, and record the language, account, time, and viewport for both captures. Do not rely on google.co.in versus google.com to select a country: Google says country domains are being redirected to google.com, and local results can appear on either domain. Treat each screenshot as evidence of what appeared in one recorded context at one time, not as a universal ranking for everyone in that country. Google’s country-domain update
1. Define what the comparison is meant to show
First decide whether you want to isolate the effect of Search region or compare the broader experience a user might see in each country.
- Region-only comparison: Keep the exact query, query language, display language, browser language, account state, and other conditions the same where possible. Change the Search region or country service and record it.
- Localized-experience comparison: You may also change display or browser language to reflect a target user. Record every change. Since region and language change together, the screenshots cannot show which change caused a difference.
Google says result language can be influenced by query language, the usefulness of available content, display language, browser or device language, and location. A display-language setting helps Google choose results but does not filter every result. Result-language filters primarily affect web results and may not cover every feature or page. Google: How Google determines the language of search results
2. Prepare two comparable capture contexts
- Choose one exact query and copy it so spelling, punctuation, and wording are identical.
- Use the same browser version, viewport size, zoom, and scroll position for both captures.
- Choose whether to use a signed-in account. If signed in, use the same account for both captures and note that saved settings can persist across browsers. If using separate profiles, record that difference.
- Set the intended country service or region using Google Search settings. Google documents Search settings as the way to choose a different country service; do not infer the service from the domain alone.
- Check the country service indicated at the bottom of the results page where available, and record the selected region. If it does not match the intended country, correct the setting before capturing.
- Set or record display language, result-language filters, and browser/device language. Do not describe a display-language choice as a complete filter of result language.
- Capture both result pages close together in time. Record the timestamp and timezone for each.
Google’s documentation on browser settings explains that saved settings may persist for signed-in users and that Search customization may use browser searches. Record account and customization context rather than claiming the captures represent all users. Google Search Help: Change your Search browser settings
3. Capture the pages with a browser
For a defensible comparison, configure and verify the region settings in each browser context first. A browser’s locale or an IP address alone is not proof that Google is showing the intended country service. These examples capture pages after you have prepared the contexts; they do not silently set Google’s Search region.
Python with Playwright
Install Playwright and its Chromium browser:
python -m pip install playwright
python -m playwright install chromium
Save this as capture_serps.py. Before running it, create two persistent browser profiles, configure Google Search settings in each for the desired country service, and verify the indication at the bottom of a results page. The profiles preserve their separate settings and cookies.
from pathlib import Path
from playwright.sync_api import sync_playwright
QUERY = "best project management software"
with sync_playwright() as p:
for label in ("india", "united-states"):
profile = Path(f"profiles/{label}")
profile.mkdir(parents=True, exist_ok=True)
context = p.chromium.launch_persistent_context(
user_data_dir=str(profile),
headless=False,
viewport={"width": 1365, "height": 900},
)
page = context.pages[0] if context.pages else context.new_page()
page.goto("https://www.google.com/", wait_until="domcontentloaded")
page.get_by_name("q").fill(QUERY)
page.keyboard.press("Enter")
page.wait_for_load_state("domcontentloaded")
page.wait_for_timeout(1500)
page.screenshot(path=f"serp-{label}.png", full_page=True)
print(f"Captured {label}: {page.url}")
context.close()
Run python capture_serps.py. On the first run, the visible browser lets you complete any consent or sign-in steps and check the country service. If the browser context is not configured as intended, stop and correct it; the script does not establish that the page represents India or the US by itself.
Node.js with Playwright
Install Playwright:
npm install playwright
Save this as capture-serps.mjs. Prepare and verify the two persistent profiles as described for Python.
import { chromium } from 'playwright';
import { mkdir } from 'node:fs/promises';
const query = 'best project management software';
for (const label of ['india', 'united-states']) {
const profile = `profiles/${label}`;
await mkdir(profile, { recursive: true });
const context = await chromium.launchPersistentContext(profile, {
headless: false,
viewport: { width: 1365, height: 900 },
});
const page = context.pages()[0] ?? await context.newPage();
await page.goto('https://www.google.com/', { waitUntil: 'domcontentloaded' });
await page.getByRole('textbox', { name: 'Search' }).fill(query);
await page.keyboard.press('Enter');
await page.waitForLoadState('domcontentloaded');
await page.waitForTimeout(1500);
await page.screenshot({ path: `serp-${label}.png`, fullPage: true });
console.log(`Captured ${label}: ${page.url()}`);
await context.close();
}
Run node capture-serps.mjs. Google’s search field accessible name can vary; if the locator fails, inspect the page and adjust the locator for the rendered page. Verify the intended country service in each context before treating the captures as a country comparison.
4. Record the comparison metadata
Store this information with each image, either in a notes file or a spreadsheet:
| Field | What to record |
|---|---|
| Query | Exact text submitted, including spelling and punctuation |
| Capture time | Date, time, and timezone |
| Country service or region | Intended setting and visible indication checked on the results page |
| Language | Display language, result-language filter, and browser/device language if known |
| Account context | Signed in or out; whether the same account and customization state were used |
| Capture context | Browser, viewport dimensions, zoom, and scroll position |
| Observed features | Ads, local packs, and other special modules, noted separately from organic listings |
Compare result order and URLs, result type, regional URL or language variants, country-service and language cues, and timestamp and viewport. Separate ads and special features from organic results. A screenshot records visible evidence; it does not establish a ranking cause or what all users in a country see.
5. Interpret country and language differences carefully
A difference between two captures may be associated with region, language signals, account customization, timing, or other capture conditions. Unless those factors are controlled, describe the observed difference without claiming a single cause.
Also distinguish the searcher’s region from a site’s localization. Google can use signals such as country-code domains, hreflang, server location, local addresses and phone numbers, language, currency, and links to infer the intended audience of a site. Those are signals about the page, not controls for the searcher’s country. Google Search Central: Managing multi-regional and multilingual sites
Google also documents limits in crawling locale-adaptive pages: its default Googlebot IP addresses appear to be US-based, and Googlebot does not set an Accept-Language request header. A regional page appearing—or not appearing—in a screenshot does not prove every localized variant is equally available to Google’s crawler. Google Search Central: How Google crawls locale-adaptive pages
Google’s 2017 explanation said the country service corresponded to the user’s location by default and could be changed in settings. It also said the active service could be seen at the bottom of the results page. Treat this as Google’s explanation from 2017, not a current statistic about India-versus-US variation. Google: Making search results more local and relevant (2017)
6. Automate repeat captures responsibly
For recurring comparisons, preserve separate browser profiles, pin the viewport and query, save timestamped files, and keep the metadata beside each capture. Re-check each profile’s country indication periodically because saved preferences and browser state can change. Avoid interpreting one pair of captures as a trend; collect repeated observations at consistent intervals if the question concerns change over time.
Full-page captures can include content below the initial viewport and may trigger lazy-loaded page content. Keep viewport and capture method consistent. If you compare only the first screen, use the same viewport and scroll position for both screenshots. A capture tool cannot remove the underlying uncertainty about personalization or prove a causal explanation.
7. Troubleshooting
| Problem | Likely cause | What to do |
|---|---|---|
google.com shows what looks like local results |
The domain does not by itself select the country service; Google says country domains redirect to google.com. |
Set the desired country service in Search settings and check the indication on the results page. |
| The country label or service is missing or unexpected | The setting was not applied, the page has not loaded fully, or the context uses a different saved preference. | Open Search settings in that same profile, correct the region, reload, and verify again before capture. |
| Results differ after changing display language | Language is one of several result-selection signals and can change the experience. | For a region-only comparison, hold language settings constant; otherwise document them as part of a localized-experience comparison. |
| The same profile behaves differently between runs | Account state, saved settings, browser history, timing, or result changes may differ. | Record sign-in and customization context, use repeat captures, and describe each as a dated observation. |
| Playwright cannot find the search box | Google’s rendered markup or accessible name may differ by context. | Open the page visibly, inspect its accessible elements, and update the locator; do not assume one selector works in every locale. |
| A localized page does not appear | Site localization, indexing, language signals, or crawling behavior may affect eligible URLs. | Record the URL that appeared and investigate the site’s regional URL and hreflang setup separately; the screenshot alone cannot diagnose indexing. |
Or skip the browser setup
ScreenshotNeo can capture a URL with one API request. It returns a screenshot or PDF, but the request does not set Google’s Search region or language. Configure and verify the relevant Google Search context before using a URL capture if you need a specific regional comparison. See the ScreenshotNeo API documentation.
cURL
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
Python
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
Node.js
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
Replace the example URL with the prepared results-page URL you intend to capture. ScreenshotNeo removes cookie banners, newsletter popups, and chat widgets before the shot; bot checks, blank pages, and failed loads are never billed; its MCP server lets AI agents take screenshots; and 1,000 screenshots a month are free with no card, with paid plans starting at $5 for 3,000. Learn about ScreenshotNeo or sign up for 1,000 free screenshots a month with no card.
Frequently asked questions
Does Google show the same results to everyone in India or the United States?
No. These captures document specific settings and context at specific times; they are not a census of users or a guarantee of identical results.
Can I use the comparison to prove that a country caused a ranking change?
Not from screenshots alone. A controlled comparison can make observations clearer, but it does not establish causation.
Should I compare only organic results?
That depends on the question. Record ads and special result modules separately so they are not confused with organic listing order.


