# Residential proxy detected as proxy: what we measured

> A residential proxy can be detected as a proxy because it is one. On one Wichita exit, FingerprintJS and incolumitas never loaded in three rounds.

Source: https://mosaicbrowser.com/blog/residential-ip-detected-as-proxy

## The residential IP several detectors already knew

A residential proxy can be detected as a proxy because it is one. On one Wichita exit, FingerprintJS and incolumitas never loaded in three rounds.

![3 of 3: Unreachable through the exit, answering direct](https://mosaicbrowser.com/covers/residential-ip-detected-as-proxy.webp)

A residential proxy gets detected as a proxy because it is one. The address belongs to a home ISP, but it is relaying somebody else's traffic, and the companies that sell IP intelligence watch residential pools for exactly that. We met a clear case of it while chasing what looked like a fingerprint bug: on one residential exit in Wichita, two detectors would not load at all.

## What a residential proxy detected as a proxy looks like from inside a test run

We had one profile paired to that Wichita exit and ran it through our detection catalogue three times. Two rows came back the same way every round:

```
row            through the exit        no proxy, same machine
fingerprintjs  unreachable x3          HTTP 200, attention
incolumitas    unreachable x3          HTTP 200, pass

```

Unreachable is a status our runner keeps apart from pass and fail. It means the site did not serve a page, so nothing about the profile was measured. Both sites were up the whole time, because they answered straight away when we asked from the same computer with no proxy in the path. What changed between the two columns was the address.

The plain reading is that the exit was known. The IP was flagged by several vendors at once, and two of the sites in our catalogue would not serve it a page. That is an ordinary fact about residential pools. An address in a pool carries strangers' traffic all day, and the lists that track pools see it doing so.

Mosaic is a desktop app

Email yourself the link and open it on your computer.

[How it works: Provider minting](https://mosaicbrowser.com/features/proxy-providers)

## Why it nearly cost us days

The same profile was failing Pixelscan with "fingerprint inconsistent", and our control browser passed. The control was an untouched Google Chrome for Testing of the same major, and at the time our control tool launched it with no proxy at all. So it compared two browsers and two countries in one go. The control passing looked like proof the fault was ours.

We tested four explanations against that result, and all four died:

```
hypothesis       what we changed                          result
the chip         patched to the host's own Apple M4 Max   fail
the canvas seed  canvas: 'off'                            fail
the proxy        detached entirely                        fail
every surface    --disable-spoofing on all 18             fail

```

The third row was our own mistake. Taking the proxy off left the profile claiming `America/Chicago` from a European address, so every result after it carried a contradiction we had introduced. A field-by-field diff of the thirteen values Pixelscan's collector gathers showed it: every capability field identical to the stock browser, and the timezone reading `America/Chicago` against the stock browser's `Europe/Brussels`. (Why that one field decides Pixelscan's verdict is in [our Pixelscan timezone sweep](https://mosaicbrowser.com/blog/pixelscan-timezone-sweep).)

Once the stock browser was given the profile's own exit, the answer took one line. Chrome for Testing from the same Wichita address was read as "fingerprint inconsistent" too. And when we minted a fresh session for the same profile, with the same seed and the same chip and only the exit moving, the Pixelscan row went `flaky: unreachable, fail, pass`.

Three separate measurements pointed the same way. The verdict was about the address, not the profile, and the two unreachable rows had been saying so from the first round.

## What we changed in the control

The control now builds a relay to the profile's own proxy, from the same `relay.ts` the launcher uses. (Chrome's `--proxy-server` switch cannot carry a username and password, which is why profiles get a local relay at all.) If the control cannot reach the profile's proxy, it refuses to run and says why. It no longer quietly produces a comparison across two countries.

A control has to differ from the thing it controls in exactly one way. "Which browser" is one way only while the exit, the timezone and the language are held the same. Leave the address loose and the control does not narrow the explanations, it adds a country to them.

## What to do when your residential exit is flagged

Read the rows that did not load before you read the ones that failed. If several unrelated detectors refuse the exit while answering your own connection, the address is the finding, and every verdict on that run is about the IP first.

Then change one thing. A new sticky session on most residential providers means a new exit, so mint one and run the same profile again. If the verdicts move with the session while the profile stays fixed, you have learned something about the pool, not the browser. This is also why we mint a separate session for each profile from a [proxy provider](https://mosaicbrowser.com/features/proxy-providers): two profiles on one session share one address, flags included ([forty profiles, forty exits](https://mosaicbrowser.com/blog/forty-profiles-forty-exits) is that rule in detail).

Mosaic's proxy check helps with part of this. It queries public DNS blocklists, reads whether the exit sits on a residential ISP or a hosting range, and looks at its reverse DNS. What it cannot read is a commercial proxy database, because those are sold, not published. So a clean result from us means the exit is not on the public lists, and the Wichita address is a reminder that a detector's vendor may still know it. The steps for checking an exit by hand are in [how to check a proxy before you use it](https://mosaicbrowser.com/guides/how-to-check-a-proxy-before-you-use-it).

## Questions

### Why is my residential proxy detected as a proxy?

Because the address really is carrying proxy traffic, and companies that sell IP intelligence watch residential pools for exactly that. The IP belongs to a home ISP, but it has been seen relaying other people's connections, and a database that records that will call it a proxy.

### Why does a site not load through a residential proxy but loads without it?

Usually the site, or a vendor in front of it, recognises the exit and refuses it. On one Wichita exit, FingerprintJS and incolumitas failed to load in three rounds each, while both answered with HTTP 200 from the same machine with no proxy.

### Does a new sticky session fix a flagged residential IP?

It can, because a new session usually means a different exit. When we minted a fresh session for the same profile, one detector row went unreachable, then fail, then pass across three rounds, with only the exit changing.

### Does Mosaic tell me if an exit is flagged?

Mosaic's proxy check queries public blocklists and reads the network type and reverse DNS of the exit. Commercial proxy databases are not public, so an exit can come back clean there and still be known to a detector's vendor.

## Related

[How to check a proxy before you use it](https://mosaicbrowser.com/guides/how-to-check-a-proxy-before-you-use-it): Check that a proxy answers and tunnels, where its exit really is, whether the address is residential or blocklisted, and that the browser stays behind it.

[We broke the timezone on purpose and Pixelscan liked it better](https://mosaicbrowser.com/blog/pixelscan-timezone-sweep): We changed only the timezone on one profile behind a Slovak exit. Pixelscan flagged masking on the Vienna row, the correct one, and the controls disagreed.

[Same proxy session on multiple profiles: forty profiles, forty exits](https://mosaicbrowser.com/blog/forty-profiles-forty-exits): The same proxy session on multiple profiles means one exit IP for all of them. A batch of ours did it in September 2026; now every profile mints its own.

[Provider accounts: one gateway line, one exit per profile](https://mosaicbrowser.com/features/proxy-providers): Paste your proxy seller's gateway line once and Mosaic mints a separate session for every profile, so each one browses from its own exit address.

[Peru, Brazil and Bahrain in three requests](https://mosaicbrowser.com/blog/three-countries-three-requests): A rotating proxy with no country pin can exit in a different country on every request. Fine for a stateless scrape, fatal to a profile that keeps one timezone.

[Detecting a proxy with two clocks](https://mosaicbrowser.com/blog/proxy-detection-by-latency): A server times the TCP handshake to the exit and a round trip to the browser. Behind a proxy the second is longer, and the gap is the tunnel.

[Through a proxy, your TCP fingerprint is the exit's](https://mosaicbrowser.com/blog/tcp-fingerprint-belongs-to-the-exit): A proxy's exit opens its own TCP connection, so the TTL, window and options a site reads come from the exit's system, not your browser or your computer.

[MSS 1300: what an MSS value says about VPN detection](https://mosaicbrowser.com/blog/mss-and-mtu-through-a-tunnel): VPN detection by MSS value: a tunnel shrinks the MSS in every SYN. A proxy opens a new connection at the exit, so a site reads the exit's MSS.

## Mosaic, on your own computer

The browser this blog is about: its own Chromium, fingerprints from real machines and a proxy exit per profile. Free holds 3 profiles. Pro is $49 a month for any number.

Mosaic is a desktop app

Email yourself the link and open it on your computer.
