A rotating proxy gives each new connection a different exit from its pool. If nothing in the username or the port names a country, the pool is the whole world, and three requests in a row can leave from three countries. We watched one endpoint do exactly that while building Mosaic's proxy check: Peru, Brazil and Bahrain, in three consecutive requests.

That is a real product, sold on purpose, and it is the right one for some jobs. It is the wrong one for a browser profile.

Why a rotating proxy shows a different country every request

Nothing was broken. A rotating gateway is a front door to a large pool of residential exits (residential proxy explains where those come from). The seller hands each connection to whichever exit is free. Without a country token the choice is global, so Peru followed by Brazil followed by Bahrain is ordinary behaviour.

For a scraper that collects public prices, or a check that loads one page from many places, this is what you pay for. Every request stands alone. Nothing carries over between them, and a new exit each time spreads the load.

Why it is fatal to a profile

A profile is a fingerprint, a proxy and a cookie jar that agree with each other. It claims one timezone, one language and one place, and Mosaic sets those from the proxy's measured exit. On a gateway that answers three countries in three requests, there is no single exit to agree with. One page can load its HTML through Peru and its scripts through Brazil, while the browser's clock says neither.

Cookies make it worse. A site that signed you in from one country sees the same session cookie arrive from another a second later. That is the pattern a stolen session makes, and a site that watches for it has no way to tell the two apart.

Paste one gateway line. Every profile mints its own exitIn Mosaic: Provider minting. One gateway line, a separate exit for every profile. Free holds 3 profiles. Pro is $49 a month for any number.

How it works: Provider minting

How our check noticed

Mosaic's proxy check makes two requests through the proxy, not one, and that is the only reason rotation shows up at all. The first is a plain HTTP lookup to ip-api.com, which gives the exit's address, country and timezone. The second goes the way the browser goes, a CONNECT tunnel to Cloudflare's /cdn-cgi/trace over HTTPS, which proves the proxy tunnels and reports the address Cloudflare saw. One request reports one exit and cannot say whether the next will match. Two can.

When the two disagree, the check marks the proxy as rotating and says so on the Proxies page: "Two connections came out at" both addresses, with both countries when they differ, then "This endpoint rotates, so a profile behind it cannot hold a timezone or a language." It is a warning, not a failure. The proxy works, and plenty of pools are sold this way.

The first version of that comparison was wrong in the other direction. On a dual-stack residential exit, the plain HTTP lookup left over IPv4 and the HTTPS probe over IPv6, so a string comparison called one sticky exit rotating, three checks in a row. Two addresses of different families say nothing about whether the exit moved, so only a same-family disagreement counts now (one exit with two addresses is that story).

The same reasoning reaches the profile editor. When a profile is matched to its exit, the measured exit goes along with the request instead of being measured again. A second measurement would open a second connection to a rotating gateway, get a different address, and set the profile to a place the screen above it is not showing.

Pinning a country, or pinning an exit

There are two fixes, and they pin different things.

A country pin keeps every exit in one country while the address keeps changing. It is the seller's country option, a token in the username or a dedicated port. For a lot of work that is enough, because the checks that matter compare countries more than addresses (pin the country, not the address). It does not fix a country that spans several timezones.

A sticky session pins one exit for a stretch of time. Most sellers spell it as a session id in the username. Some decide it by port, and one refused a session token on its rotating port with Can not use -session- on rotating ports, which is how we learned the port, not the username, decides.

In Mosaic you rarely set either by hand. Paste the seller's gateway line once as a provider, pick a country where the seller's format has a word for it, and each profile mints its own session, so it has one exit of its own and does not share it with the profile next to it. The other checks a proxy should pass before you trust an account to it are listed step by step in how to check a proxy before you use it.