๐ŸŽ‰ Premium Proxies ยท 3-Day Free TrialClaim Now โ†’
Guides

How to Test If Your Proxy Is Working

Test your proxy with browser checks, curl, Python, and online proxy checker tools. Verify exit IP, HTTPS tunneling, speed, and authentication status.

S SparkProxy 15 15 min read
Share
How to Test If Your Proxy Is Working

Before you add a proxy to any application, confirm it actually works. A proxy can accept the TCP connection and still fail to route traffic, return your real IP, or time out on HTTPS. This guide shows you exactly how to test a proxy in every environment you will encounter, browser, command line, Python, and online proxy checker tools, so you know what is happening at each layer before writing a single line of application code.

What "Working" Actually Means for a Proxy

A proxy has several independent failure modes. Each one produces a different symptom:

What Can FailSymptomTest That Catches It
TCP connection to proxy`Connection refused` or timeout`curl --proxy` with a fast timeout
Proxy authentication`407 Proxy Authentication Required``curl -x user:pass@host:port`
HTTP routing (port 80)Real IP shown, or `ERR_TUNNEL_CONNECTION_FAILED`Check exit IP on httpbin.org/ip
HTTPS tunneling (CONNECT)Real IP shown for HTTPS requests onlyCheck exit IP via an HTTPS URL
DNS leaking through proxyProxy IP shown but DNS resolves locallyDNS leak test at dnsleaktest.com

"The proxy is working" means all five pass. Many tutorials only check the exit IP on HTTP, which passes even when HTTPS tunneling is broken. Run every test in this guide for a complete proxy check.


Test Your Proxy in a Browser

The quickest manual test proxy method is configuring a browser to use the proxy and then visiting an IP-reveal site.

Chrome (Windows/Mac)

Chrome uses the OS proxy settings by default. To test a single proxy without changing system settings, launch Chrome with a flag:

Windows (Command Prompt):

"C:\Program Files\Google\Chrome\Application\chrome.exe" --proxy-server="your-proxy.sparkproxy.io:10000" --proxy-bypass-list="<local>" --user-data-dir="%TEMP%\chrome-proxy-test"

Mac (Terminal):

/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
  --proxy-server="your-proxy.sparkproxy.io:10000" \
  --proxy-bypass-list="<local>" \
  --user-data-dir="/tmp/chrome-proxy-test"

After Chrome opens, navigate to https://httpbin.org/ip. The JSON response should show the proxy's datacenter IP, not your real IP.

The --user-data-dir flag forces a fresh profile, this prevents Chrome from caching your real IP from a previous session and mistakenly reporting it as the proxy IP.

Firefox

  1. Open Settings โ†’ General โ†’ Network Settings โ†’ Manual proxy configuration
  2. Enter the proxy host and port under HTTP Proxy
  3. Check Also use this proxy for HTTPS
  4. Visit https://httpbin.org/ip

Free trial

Scraping at scale? Skip the blocks.

Fast, unblockable datacentre proxies with unlimited bandwidth.

Check Your Proxy with curl

curl is the fastest way to check proxy connectivity from the command line. It is available on Windows (via curl.exe bundled since Windows 10), Mac, and Linux.

Basic connectivity test

curl -x your-proxy.sparkproxy.io:10000 https://httpbin.org/ip

Expected output:

{
  "origin": "1.2.3.4"
}

The IP shown should be the proxy's datacenter IP. If it matches your real IP, the proxy is not routing traffic.

Test with credentials (username:password auth)

curl -x http://USERNAME:PASSWORD@your-proxy.sparkproxy.io:10000 https://httpbin.org/ip

Test with a timeout to catch dead proxies quickly

curl --connect-timeout 5 --max-time 10 \
  -x your-proxy.sparkproxy.io:10000 \
  https://httpbin.org/ip

--connect-timeout 5 limits the TCP handshake to 5 seconds. --max-time 10 limits the full request. Both together prevent curl from hanging indefinitely on a dead proxy.

Test HTTP and HTTPS separately

# HTTP
curl -x your-proxy.sparkproxy.io:10000 http://httpbin.org/ip

# HTTPS (uses HTTP CONNECT tunneling through the proxy)
curl -x your-proxy.sparkproxy.io:10000 https://httpbin.org/ip

If HTTP returns the proxy IP but HTTPS returns your real IP (or fails), the proxy accepts connections but does not support HTTP CONNECT tunneling. Contact your provider, this is a proxy configuration issue on the server side.

Verbose output for debugging

curl -v -x your-proxy.sparkproxy.io:10000 https://httpbin.org/ip 2>&1 | head -40

The -v flag shows the full connection flow. Look for:

  • * Connected to your-proxy.sparkproxy.io, TCP connect succeeded
  • * CONNECT httpbin.org:443 HTTP/1.1, CONNECT tunneling initiated
  • * SSL connection using TLS 1.3, TLS established through the tunnel
  • < HTTP/1.1 200 OK, target responded

Test Proxy with Python requests

The Python requests library is the most precise way to test proxy behavior programmatically.

import requests

def test_proxy(proxy_url: str, timeout: int = 10) -> dict:
    """
    Returns a result dict with status, exit_ip, and latency.
    proxy_url format: "http://host:port" or "http://user:pass@host:port"
    """
    proxies = {"http": proxy_url, "https": proxy_url}
    try:
        resp = requests.get(
            "https://httpbin.org/ip",
            proxies=proxies,
            timeout=timeout,
        )
        resp.raise_for_status()
        return {
            "proxy":      proxy_url,
            "status":     "ok",
            "exit_ip":    resp.json().get("origin"),
            "latency_ms": int(resp.elapsed.total_seconds() * 1000),
            "http_code":  resp.status_code,
        }
    except requests.exceptions.ProxyError as exc:
        return {"proxy": proxy_url, "status": "proxy_error", "error": str(exc)}
    except requests.exceptions.ConnectTimeout:
        return {"proxy": proxy_url, "status": "timeout"}
    except requests.exceptions.RequestException as exc:
        return {"proxy": proxy_url, "status": "failed", "error": str(exc)}


result = test_proxy("http://your-proxy.sparkproxy.io:10000")
print(result)
# {"proxy": "http://...", "status": "ok", "exit_ip": "1.2.3.4", "latency_ms": 312, "http_code": 200}

Test multiple proxies in parallel:

from concurrent.futures import ThreadPoolExecutor

PROXIES = [
    "http://your-proxy-1.sparkproxy.io:10000",
    "http://your-proxy-2.sparkproxy.io:10001",
    "http://your-proxy-3.sparkproxy.io:10002",
]

with ThreadPoolExecutor(max_workers=10) as executor:
    results = list(executor.map(test_proxy, PROXIES))

for r in results:
    status = r["status"]
    ip     = r.get("exit_ip", "N/A")
    ms     = r.get("latency_ms", "N/A")
    print(f"[{status:12}] {r['proxy']}  โ†’  {ip}  ({ms} ms)")

Test HTTPS Traffic Separately

A critical step that most check proxy guides omit: verify that HTTPS traffic, not just HTTP, routes through the proxy. Many proxy configurations work for HTTP but silently fall back to your real IP for HTTPS.

import requests

def test_proxy_full(proxy_url: str, timeout: int = 10) -> dict:
    proxies = {"http": proxy_url, "https": proxy_url}
    results = {}

    # HTTP test
    try:
        r = requests.get("http://httpbin.org/ip", proxies=proxies, timeout=timeout)
        results["http_ip"] = r.json().get("origin")
    except Exception as exc:
        results["http_ip"] = f"FAILED: {exc}"

    # HTTPS test
    try:
        r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=timeout)
        results["https_ip"] = r.json().get("origin")
    except Exception as exc:
        results["https_ip"] = f"FAILED: {exc}"

    # Consistency check
    results["consistent"] = results["http_ip"] == results["https_ip"]
    results["proxy"] = proxy_url
    return results


r = test_proxy_full("http://your-proxy.sparkproxy.io:10000")
print(r)
# {"http_ip": "1.2.3.4", "https_ip": "1.2.3.4", "consistent": True, ...}

If consistent is False, HTTP and HTTPS return different IPs, the proxy routes HTTP traffic but not HTTPS. The fix is on the proxy server side (CONNECT tunneling must be enabled).


Check Proxy Speed and Latency

Proxy latency is the time from sending the request to receiving the first byte of response through the proxy. It includes TCP connect time, proxy processing time, and target server response time.

import time
import requests

def measure_proxy_latency(
    proxy_url: str,
    test_url: str = "https://httpbin.org/ip",
    runs: int = 5,
) -> dict:
    proxies  = {"http": proxy_url, "https": proxy_url}
    latencies = []

    for _ in range(runs):
        try:
            resp = requests.get(test_url, proxies=proxies, timeout=15)
            latencies.append(resp.elapsed.total_seconds() * 1000)
        except requests.exceptions.RequestException:
            latencies.append(None)

    valid = [l for l in latencies if l is not None]
    if not valid:
        return {"proxy": proxy_url, "status": "all_failed"}

    return {
        "proxy":    proxy_url,
        "runs":     runs,
        "success":  len(valid),
        "avg_ms":   round(sum(valid) / len(valid)),
        "min_ms":   round(min(valid)),
        "max_ms":   round(max(valid)),
        "failed":   runs - len(valid),
    }

result = measure_proxy_latency("http://your-proxy.sparkproxy.io:10000")
print(result)
# {"proxy": "...", "runs": 5, "success": 5, "avg_ms": 287, "min_ms": 241, "max_ms": 334, "failed": 0}

Latency benchmarks for datacenter proxies:

LatencyAssessment
< 100 msExcellent, same-region proxy
100, 300 msGood, cross-region, still fast
300, 600 msAcceptable, inter-continental routing
> 600 msSlow, consider a closer proxy node

Online Proxy Checker Tools

Online proxy checker tools test a proxy from their own servers, which means they test the proxy's reachability from a remote location rather than from your machine. Use them to confirm the proxy is publicly accessible, not just accessible from your local network.

ToolWhat It TestsBest For
`https://httpbin.org/ip`Exit IP (visited through the proxy via curl/Python)Scripted testing
`https://ipv4.icanhazip.com`Exit IP (plain text response)Minimal response parsing
`https://www.whatismyipaddress.com`Exit IP + geolocation + ISPManual browser testing
`https://dnsleaktest.com`DNS leak, are DNS queries bypassing the proxy?DNS leak verification
`https://browserleaks.com/ip`Exit IP + WebRTC leak + timezoneBrowser privacy testing

Note on third-party proxy checker websites: Tools that ask you to enter a proxy host and port and test it remotely (rather than from your machine) measure reachability from their servers. This is useful for confirming the proxy is publicly online but does not tell you whether it works from your specific server or cloud instance. Always run a local test (curl or Python) in addition to an online tool.


Test Proxy Authentication

If your proxy uses username and password authentication rather than IP whitelisting, test authentication separately from connectivity.

import requests

def test_proxy_auth(host: str, port: int, username: str, password: str) -> dict:
    proxy_url = f"http://{username}:{password}@{host}:{port}"
    proxies   = {"http": proxy_url, "https": proxy_url}

    try:
        resp = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)

        if resp.status_code == 407:
            return {"status": "auth_failed", "detail": "407 Proxy Authentication Required"}

        resp.raise_for_status()
        return {
            "status":    "ok",
            "exit_ip":   resp.json().get("origin"),
            "http_code": resp.status_code,
        }

    except requests.exceptions.ProxyError as exc:
        # ProxyError wraps 407 in some urllib3 versions
        return {"status": "auth_failed", "error": str(exc)}
    except requests.exceptions.RequestException as exc:
        return {"status": "connection_failed", "error": str(exc)}


result = test_proxy_auth(
    host="your-proxy.sparkproxy.io",
    port=10000,
    username="YOUR_USERNAME",
    password="YOUR_PASSWORD",
)
print(result)

proxy authentication

Common authentication failure causes:

SymptomMost Likely Cause
`407 Proxy Authentication Required`Wrong username or password
`Connection refused`Correct credentials, but machine IP is not whitelisted (if IP auth required)
`403 Forbidden`Account suspended or quota exceeded
Auth succeeds, but wrong exit IPCredentials belong to a different sub-account or pool

Automated Proxy Health Check Script

For production use, run an automated health check before each scraping job and periodically during long runs. This script tests HTTP, HTTPS, latency, and authentication in one pass:

import requests
import concurrent.futures
import json
from datetime import datetime, timezone


def full_proxy_check(proxy_url: str, timeout: int = 10) -> dict:
    """
    Comprehensive single-proxy health check.
    Tests HTTP exit IP, HTTPS exit IP, latency, and consistency.
    """
    proxies = {"http": proxy_url, "https": proxy_url}
    result  = {
        "proxy":     proxy_url,
        "timestamp": datetime.now(timezone.utc).isoformat(),
        "http_ip":   None,
        "https_ip":  None,
        "latency_ms": None,
        "consistent": False,
        "status":    "failed",
    }

    # HTTP test
    try:
        r = requests.get("http://httpbin.org/ip", proxies=proxies, timeout=timeout)
        result["http_ip"] = r.json().get("origin")
    except Exception:
        result["error"] = "http_failed"
        return result

    # HTTPS test
    try:
        r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=timeout)
        result["https_ip"]   = r.json().get("origin")
        result["latency_ms"] = int(r.elapsed.total_seconds() * 1000)
    except Exception:
        result["error"] = "https_failed"
        return result

    result["consistent"] = result["http_ip"] == result["https_ip"]
    result["status"]     = "ok" if result["consistent"] else "inconsistent"
    return result


def check_all(proxy_list: list[str], workers: int = 20) -> list[dict]:
    with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor:
        results = list(executor.map(full_proxy_check, proxy_list))

    ok      = [r for r in results if r["status"] == "ok"]
    failed  = [r for r in results if r["status"] != "ok"]

    print(f"Healthy: {len(ok)}/{len(proxy_list)}")
    if failed:
        print(f"Failed ({len(failed)}):")
        for r in failed:
            print(f"  {r['proxy']} โ†’ {r.get('error', r['status'])}")

    return ok  # Return only healthy proxies for use in your application


PROXIES = [
    "http://your-proxy-1.sparkproxy.io:10000",
    "http://your-proxy-2.sparkproxy.io:10001",
    "http://your-proxy-3.sparkproxy.io:10002",
]

healthy = check_all(PROXIES)
print(json.dumps(healthy, indent=2))

Common Proxy Test Failures and Fixes

Error / SymptomCauseFix
Exit IP matches your real IP (HTTP)Proxy not accepting traffic on that portConfirm port number in SparkProxy dashboard; try alternate port
Exit IP matches your real IP (HTTPS only)Proxy doesn't support HTTP CONNECTContact provider; switch to a proxy with CONNECT support
`407 Proxy Authentication Required`Wrong credentials or IP not whitelistedCheck username/password; add your IP to whitelist
`Connection refused`Proxy host unreachable or port blockedTest TCP with `telnet your-proxy.sparkproxy.io 10000`; check firewall
`ProxyError: Cannot connect to proxy`DNS cannot resolve proxy hostnameCheck for typos; try IP address directly instead of hostname
`ConnectionError: Remote end closed connection`Proxy dropped connection (overloaded or banned IP)Try a different proxy from your pool
`SSLError: CERTIFICATE_VERIFY_FAILED`Proxy is intercepting TLS (MITM proxy)Disable only if you trust the proxy; or use `verify=False` only for testing
curl returns proxy IP, Python returns real IP`HTTP_PROXY` or `HTTPS_PROXY` env var overridingRun `session.trust_env = False` to ignore env vars in requests
Proxy works from laptop, fails from cloud serverCloud provider blocks outbound on proxy portTry port 80, 8080, or 443, confirm with SparkProxy support which ports are open

Frequently asked questions

curl -x your-proxy.sparkproxy.io:10000 https://httpbin.org/ip, if the IP in the response is not your real IP, the proxy is routing traffic correctly for both HTTP and HTTPS.

HTTP and HTTPS use different proxy mechanisms. HTTP proxies requests directly. HTTPS requires the proxy to support the HTTP CONNECT method to establish a tunnel, your proxy may not have CONNECT enabled. Contact your proxy provider. All SparkProxy datacenter proxies support CONNECT tunneling.

Visit https://dnsleaktest.com through the proxy (configure it in your browser first). If the DNS servers shown belong to your ISP rather than the proxy provider's network, your DNS queries are bypassing the proxy, a DNS leak. Fix: configure DNS-over-HTTPS or point DNS to the proxy's resolver.

Yes, https://httpbin.org/ip is free, open-source, and requires no account. Visit it through your configured proxy (browser or curl) and the JSON response shows your exit IP. It is more reliable than third-party "proxy checker" websites that test from their own servers.

Use curl --socks5 your-proxy.sparkproxy.io:1080 https://httpbin.org/ip. For Python: install requests[socks] (pip install requests[socks]) and use proxy_url = "socks5://user:pass@host:1080".

The most common cause is the HTTP_PROXY or HTTPS_PROXY environment variable overriding your configured proxy. Add session.trust_env = False to your requests.Session to prevent environment variables from interfering. Also check that you are passing the proxy to both the "http" and "https" keys of the proxies dict.


Limited-time ยท 50% off

Get 50% off your first purchase

Premium datacentre proxies with unlimited bandwidth. Use the code at checkout.

Offer ends soon โ€” claim it before it's gone

Claim Discount

About the Author

SparkProxy Technical Team, The SparkProxy engineering team builds and maintains global datacenter and residential proxy infrastructure. This guide reflects proxy testing patterns validated with curl 8.x, Python 3.11+, and requests 2.32+ (May 2026).

Citations: httpbin.org, HTTP request and response service ยท curl man page, proxy options

Keep reading

Related articles

How to Set Up and Use a Proxy in Postman

How to Set Up and Use a Proxy in Postman

Set up a proxy in Postman the right way: custom proxy host and port, proxy auth, SSL cert fixes, verify the exit IP in the Console, plus Newman env vars.

SparkProxyยทGuides