Proxy rotation and a VPN change your public address at different layers, and that difference decides what leaks. A VPN moves every packet into a tunnel, so the source address the target sees is the tunnel endpoint. A proxy sits above the network layer: only the requests you send through it appear from the exit, while everything else on the machine keeps the real address. Getting that split right turns rotation from a checkbox into a design decision.

Where the public address actually comes from

The address a target sees is the one your traffic last left from, and on a home connection that is the provider's address on your router, not anything the machine owns. Restarting the router may hand back the same lease, and changing its MAC address sometimes produces a new one, but neither gives you a country selector. A VPN replaces the source address at the IP layer, so every packet from the machine, including DNS and background updates, leaves from the tunnel endpoint. A proxy works one layer up: it accepts a request, opens its own connection to the target, and only that request appears from the exit. Everything else on the machine still uses the real address.

That split explains most surprises. A browser extension pointed at a proxy changes what the browser sends and nothing else, so a second application on the same host still leaks the original address. A system-wide VPN has the opposite failure mode, covering traffic you wanted to keep local and failing closed only if the client is configured to. Choosing between the two is really choosing which traffic has to move.

Rotation then applies to whichever layer you picked. With a proxy, rotation means the next request uses a different exit. With a VPN, it means tearing down and rebuilding the tunnel, which is slower and shows up as a visible reconnect.

What an HTTP proxy can read, and what it cannot

For plain HTTP the proxy sees an absolute URI in the request line, every header and the body. It can log all of it and rewrite any of it, which is why a free proxy that injects a script into responses is doing exactly what the protocol permits. Authentication uses Proxy-Authorization, and a missing or wrong credential produces 407 Proxy Authentication Required rather than a connection error.

For HTTPS the client sends CONNECT host:port and the proxy opens a raw tunnel, after which it sees encrypted bytes. It still learns the hostname from the CONNECT line and usually from the SNI field in the TLS handshake, so hostname-level logging survives even though the payload does not. Reading the payload requires terminating TLS with a certificate the client trusts, which is a different product with a different risk. The HTTP semantics specification defines CONNECT as a tunnel request, which is the right mental model for what an exit can and cannot see.

curl -v -x http://proxy.example.net:8080 https://example.com 2>&1 | grep -E 'CONNECT|Proxy-'

The verbose output shows the CONNECT line before any TLS traffic, and that is the moment the proxy learns your destination. A proxy that answers with 407 never opened the tunnel, so retrying with different TLS settings will not help.

Rotation granularity decides what breaks

Rotating on every request is the setting that looks safest and breaks the most. Cookies, CSRF tokens and server-side sessions are bound to an identity, and an identity that changes between the login and the next call looks like session hijacking to the target. Many providers expose a sticky session by encoding it in the proxy username, so the exit stays fixed for a chosen window.

Pick the granularity from the task rather than from the provider default. A crawl that fetches independent pages can rotate per request, while a checkout flow or an authenticated API has to hold one exit for the whole flow. The two calls below show a sticky username and a plain rotating endpoint, and the socks5h scheme resolves names at the proxy instead of locally.

curl -sS -x http://user-session-a1b2:[email protected]:8080 https://ifconfig.me
curl -sS -x socks5h://127.0.0.1:1080 https://ifconfig.me

Local DNS is a quiet leak. If the client resolves the name before connecting, the resolver still learns every host you visit even though the HTTP request exits somewhere else. The socks5h form and proxy-side resolution avoid that, and using them costs nothing.

What the target classifies besides the address

Address reputation is one input among several. Targets combine the ASN and its datacenter-or-residential label, the TLS fingerprint of the client, HTTP/2 settings, header order, request rate and the shape of the navigation. A residential exit driven by a headless browser can fail where a datacenter exit driven by a real session passes.

Exit type sets what you can honestly claim about the traffic, and each one carries a different cost.

Exit typeWhat the target seesMain cost
Datacenter proxyHosting ASN, cheap, often pre-blockedLow reputation, easy to detect
Residential networkA consumer ISP address belonging to someone elseConsent and terms-of-service exposure
Mobile carrierA carrier NAT address shared by many subscribersPrice, plus shared blame for abuse
Your own cloud egressAn address you are accountable forRecognisable, but defensible

A shared exit is not neutral. Whatever else runs from that address lands in the same reputation bucket, and an address already burned by other tenants fails before your first request is read.

Pick an exit you can describe in a policy

The useful question is not how to hide the address but who is accountable for the traffic leaving it. Your own cloud egress per job, a contracted provider with a data-processing agreement and published retention, and a self-hosted VPN with one identity per job are all describable in a sentence. A free list is not, because its operator has no obligation to you and every incentive to log.

Keep your own rate limits below whatever the target tolerates, and collect only the fields the task needs, so a mistake stays small. Rotating faster to escape a block usually raises the request rate that caused it.

Write the chosen exit, its rotation window and its owner into the job config before the first run. When the block arrives, that note is what tells you whether to change the exit or change the behaviour.

Sɛbɛn minnu bɛ tali kɛ