Locale Cloaking Checker
Fetch a live URL as Googlebot and as a browser sending a different Accept-Language and diff what each gets back — title, h1, canonical, <html lang>, word count — to catch locale-adaptive serving Google never crawls, which can read as unintentional cloaking.
Input
Fetched twice server-side — once as Googlebot, once as a browser requesting the locale below.
Sent as the Accept-Language header on the second request.
Output
| Severity | Field | Issue |
|---|---|---|
| No data yet | ||
| Field | Googlebot (default) | Locale request | Match |
|---|---|---|---|
| No data yet | |||
Guides
What the Locale Cloaking Checker does
Enter a live URL and this tool fetches it twice server-side — once with Google's real Googlebot user agent and no locale preference (Googlebot's default), once with a regular browser user agent sending the Accept-Language you pick — then diffs what each gets back: title tag, meta description, canonical URL, <html lang>, h1 heading, and an approximate word count. A mismatch means the site is swapping content server-side by request locale instead of serving it from its own crawlable URL — content Google's crawler, which never sends that locale, will never see. Left unintentional, that's exactly the pattern Google's own cloaking guidance flags.
How to use it
- Enter the full URL of the page you want to check.
- Pick the locale to simulate — sent as the
Accept-Languageheader on the second request. - Click Compare Googlebot vs locale. The page is fetched twice server-side (cross-origin HTML can't be read from the browser, and spoofing a crawler's User-Agent/Accept-Language isn't something client-side JavaScript can do).
- Review the Cloaking risk issues table for anything to fix, and the Googlebot vs. locale request table for the full side-by-side comparison.
What gets flagged
- Final URL, HTTP status, title, canonical URL (error) — these directly change what gets indexed and under what URL, or mean the two crawls landed on genuinely different pages.
- <html lang>, meta description, h1 (warning) — the localized markup exists, but only reachable by sending a header Googlebot doesn't send.
- Word count, hreflang (info/warning) — secondary signals; a large word-count gap (>15%) usually means the locale-specific content isn't reachable at a crawlable URL, and a page that declares hreflang alternates but returns byte-identical content for the requested locale gets a heads-up either way.
Why this happens
The correct pattern for multilingual content is a distinct, crawlable URL per locale (/fr/, fr.example.com, …) tied together with hreflang — Google can then crawl and index each version on its own. A site that instead swaps content on the same URL based on Accept-Language or geo-IP shows different things to different requesters of the identical URL. That's indistinguishable, from Google's side, from cloaking — even when the intent is a better user experience, not manipulation.
Scope
This compares language-negotiated adaptive serving (Accept-Language) — it doesn't have real geo-distributed egress IPs, so it can't replicate IP-geolocation-only serving (a site that only swaps content based on the requester's country, ignoring Accept-Language entirely, won't show a difference here). Both fetches read the raw HTML response — there's no headless browser rendering either side, so JavaScript-injected locale switching that happens after the initial HTML load won't show up here either.
Privacy
The URL is fetched by our server only to compare the two responses and isn't stored. Requests to private or local network addresses are blocked.
Use it from code
From 3 credits per callREST API
curl -X POST https://api.iotools.cloud/v1/tool/locale-cloaking-checker \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/",
"locale": "fr-FR,fr;q=0.9"
}'Swap in your own key from your account. The tool's fields are the body — no wrapper.
Ask an AI agent
Use the IOTools `locale-cloaking-checker` tool (Locale Cloaking Checker) on this input:
YOUR_INPUT_HEREPaste this at any agent connected to the IOTools MCP server, then add your input.