Guides

How Websites Detect Proxies (And What Actually Helps)

Every proxy user eventually hits a block, a CAPTCHA wall, or a mysterious 403. The natural question: how did they know? The answer is almost never a single check. Modern anti-bot systems layer multiple detection signals — from your IP address to the way your TLS handshake looks — and score them together. Understanding these layers is the first step toward not tripping them.

Layer 1: IP reputation databases

The fastest and cheapest check. Services like MaxMind, IP2Location, and IPinfo maintain databases that flag IPs belonging to hosting providers, known VPNs, and commercial proxy pools. When your request arrives from an AWS or Hetzner IP range, it gets a “datacenter” tag before anything else is evaluated.

This is why residential IPs often pass where datacenter IPs don't. A residential IP is registered to an ISP and looks like a normal home connection. A datacenter IP is registered to a hosting company — and real humans rarely browse from hosting companies.

What helps: residential or mobile proxy pools. If you must use datacenter IPs, pick providers whose ranges aren't widely flagged yet — though this is a losing game long-term.

Layer 2: TLS and JA4 fingerprinting

This layer fires before your first HTTP byte arrives. When your client opens a TLS connection, the ClientHello message advertises supported cipher suites, extensions, and elliptic curves in a specific order. That order forms a fingerprint — JA3 (legacy) or the newer JA4 standard.

A real Chrome browser produces a recognizable JA4 hash. A Python requests script produces a completely different one. If your HTTP headers claim to be Chrome but your TLS fingerprint says Python, that mismatch alone can flag the request. Major CDNs and WAFs expose TLS fingerprints to their bot rules — Cloudflare and AWS CloudFront, for example, document JA3/JA4 support.

What helps: use an HTTP client that reproduces a real browser's TLS stack. Libraries like curl_cffi, curl-impersonate, tls-client, or a real headless browser (Playwright, Puppeteer) get this right. Proxies alone don't change your TLS fingerprint — your client does.

Layer 3: HTTP header analysis

After TLS, the server inspects your HTTP headers. Key signals:

  • Header order — browsers send headers in a consistent order. Scrapers and HTTP libraries often don't match.
  • Client Hints — modern Chrome sends Sec-CH-UA headers. Their absence from a request claiming to be a recent Chrome is a red flag.
  • HTTP/2 frame order — the SETTINGS, WINDOW_UPDATE, and PRIORITY frames your client sends have a characteristic shape per browser. Akamai published the widely used HTTP/2 fingerprint format, so a client can pass the TLS check and still fail here.
  • Proxy-revealing headers — misconfigured proxies may inject X-Forwarded-For, Via, or X-Real-IP headers that explicitly announce proxy use.

What helps: a proxy that doesn't add telltale headers — ours adds no Via or X-Forwarded-For, and HTTPS passes through a tunnel it can't read. On the client side, match real browser header sets (including order) for whatever User-Agent you claim.

Layer 4: Browser fingerprinting

If JavaScript runs (browser or headless), the site can collect dozens of signals: Canvas and WebGL rendering hashes, installed fonts, screen dimensions, timezone, language, navigator properties, AudioContext output, and more. Anti-bot vendors like HUMAN (PerimeterX), DataDome, and Kasada score these together.

Headless browsers have their own tells: navigator.webdriver = true, missing plugins, generic WebGL renderers (“SwiftShader”), or a viewport size that no real device uses. Anti-detect browsers (Multilogin, GoLogin, AdsPower) exist to spoof these signals consistently — the key word being consistently. Random values across signals are actually easier to detect than a coherent but generic profile.

What helps: consistency over randomization. If you spoof a macOS Chrome profile, make sure Canvas, WebGL, fonts, timezone, and screen size all match what that setup would actually produce.

Layer 5: Behavioral analysis

The deepest layer. Even with a perfect IP and fingerprint, inhuman behavior gives you away:

  • Requesting 200 pages per minute with zero mouse movement.
  • Hitting pages in alphabetical or sitemap order.
  • No scrolling, no idle time, no referrer variation.
  • The same “user” appearing from three countries in five minutes — which is why sloppy IP rotation can actually hurt you.

What helps: realistic request pacing, randomized delays, session-aware rotation (keep one IP for a logical session, then rotate), and — where possible — actually rendering pages and simulating human interaction.

What proxies do and don't solve

A proxy changes one thing: the IP address the target sees. That matters — IP reputation is still the first and cheapest check — but it's only one layer. A well-designed scraping setup combines the right proxy type with a client that passes the other four layers too.

Here's a realistic breakdown of what each proxy type buys you:

Proxy typeIP reputationTLS/header layersBest for
DatacenterOften flaggedNo effectAPIs, low-protection targets
ResidentialUsually trusted (ISP-assigned); shared pools can be flaggedNo effectProtected sites, geo-targeting
MobileRarely blocked outright (CGNAT sharing)No effectHighest-protection targets

Notice the “No effect” column — the proxy doesn't change your TLS fingerprint, your headers, or your browser fingerprint. Those are client-side concerns. The proxy's job is to give you a well-reputed, correctly-typed IP in the right geography. Your client's job is everything else.

A practical detection checklist

If you're getting blocked and aren't sure why, work through these layers in order:

  1. Check the IP — look it up on ipinfo.io. Is it flagged as “hosting”? Switch to residential.
  2. Check TLS — compare your JA3/JA4 against a real browser's. A fingerprint echo page such as tls.peet.ws, or a packet capture in Wireshark, shows what your client sends.
  3. Check headers — inspect the exact headers your client sends (order matters). Compare against a real browser's dev-tools capture.
  4. Check the fingerprint — visit bot-detection test pages (CreepJS, BrowserLeaks) through your setup and look for red flags.
  5. Check behavior — slow down, add jitter, keep sessions realistic.

For scripted clients, IP reputation and TLS mismatches are the usual suspects, so fix those first before reaching for expensive anti-detect tooling.

A note on responsible use

Understanding detection isn't about “beating” security — it's about building collection systems that are efficient and don't waste resources on both sides. Respect rate limits, robots.txt, and terms of service. Hammering a site until you get blocked and then rotating IPs to keep hammering it is not a proxy problem — it's a design problem. Good proxy hygiene and good scraping ethics go hand in hand. For client-specific setup, see the guides for Python requests, Scrapy, and Playwright. Get 1 GB free to test your stack against real residential and datacenter exits, or see pricing.