Screenshot a website from another country, as locals see it
To screenshot a website from another country, the request has to come from there. Prices, availability, legal notices and even the language change with the visitor’s location, so ad verification, price monitoring, localization QA and compliance checks all need the regional version of a page. proxy.location pins the exit country of the built-in proxy with a two-letter code.
Geo-targeted pages serve your screenshot the wrong region
Localization is decided server-side from the IP address, sometimes combined with the Accept-Language header. A screenshot taken from a datacenter in the United States shows the US store, the US price and the US cookie notice, whatever your users elsewhere get.
The workarounds are fragile. Appending a country parameter to the URL works only on sites that expose one, and spoofing Accept-Language changes the language but not the region. A VPN on a laptop does not scale past a handful of manual checks, and buying country-specific proxies means vetting providers, rotating exits and paying per country.
With proxy.location the request exits from a proxy in the country you choose, so the target serves that region’s version. Forward Accept-Language with the headers parameter and the page renders in the local language too. Both are Pro options, and they compose with everything else the Screenshot API does.
How to take a geolocated screenshot of a website
Two parameters cover most localization logic: the exit country for IP-based targeting and Accept-Language for language negotiation. The proxy guide shows both next to the other proxy patterns.
import createClient from 'microlink.io'
const microlink = createClient({
apiKey: process.env.MICROLINK_API_KEY
})
const { url } = await microlink.screenshot('https://example.com/pricing', {
proxy: { location: 'fr' }
})The request is routed through a proxy in France, so the page serves its French variant: local prices, stock and legal copy. Codes are ISO 3166-1 alpha-2 and case-insensitive.
import createClient from 'microlink.io'
const microlink = createClient({
apiKey: process.env.MICROLINK_API_KEY
})
const { url } = await microlink.screenshot('https://example.com', {
proxy: { location: 'jp' },
headers: { 'x-api-header-accept-language': 'ja-JP' }
})The SDK sends headers as real HTTP request headers, and any header prefixed with x-api-header- is forwarded to the target with the prefix stripped. Sites that negotiate language from Accept-Language render in Japanese instead of falling back to English.
curl 'https://pro.microlink.io/?url=https%3A%2F%2Fexample.com%2Fpricing&screenshot=true&meta=false&proxy.location=fr' \
-H 'x-api-key: $MICROLINK_API_KEY'proxy.location is a Pro option, so the URL targets pro.microlink.io. Unknown country codes are rejected with the EINVALQUERY error instead of silently falling back to the default.
import createClient from 'microlink.io'
const microlink = createClient({
apiKey: process.env.MICROLINK_API_KEY
})
const { url } = await microlink.screenshot(
'https://geolocation.microlink.io',
{ proxy: { location: 'fr' } }
)geolocation.microlink.io returns the origin IP and country seen by the server. Capturing it with the same proxy.location confirms the route before you spend requests on real targets.
- proxy.location ISO 3166-1 alpha-2 country code, case-insensitive. Default us. Exclusive with proxy.url. Pro plans.
- headers Non-sensitive request headers such as Accept-Language, forwarded to the target. Pro plans.
- device Combine with a mobile preset to capture the local mobile experience.
- adblock On by default. Set it to false to keep regional consent banners in the capture.
- cacheKey Appends a custom identifier to the cache key when variants need extra separation. Pro plans.
Requests with different proxy.location values are cached separately, because the cache key includes every recognized query parameter. One capture per country is rendered, and every repeat within the cache lifetime is a hit.
Why a screenshot from another country needs a real exit IP
Spoofing headers is not enough for IP-based localization, and buying country proxies yourself is a full-time chore.
The same option localizes other products: see region-specific metadata for the titles, prices and descriptions a country gets.
Values in the headers query parameter are public. Keep cookies and tokens in x-api-header-* request headers, as described in screenshots behind a login.
When not to: if the page localizes only from the browser language, a forwarded Accept-Language header is enough and needs no country. If the site blocks automation altogether, start with the built-in proxy recipe.
FAQ
Which countries can I take a screenshot from?
How do I screenshot a website from another country without a VPN?
Can I combine proxy.location with my own proxy for screenshots?
Does the exit country change the language of the screenshot?
Are geolocated screenshots cached separately per country?
Solve the next problem with the same API
Screenshot blocked websites
Screenshots without cookie banners or ads
Mobile screenshots at any viewport
Screenshots behind a login
Region-specific metadata
Markdown from bot-protected pages
Ready to capture local versions?
Prices, stock and copy as your customers in each country see them. Get a Pro key and pin the request to any supported country.