Check a list of proxies for liveness, latency, exit IP and anonymity — one file, one dependency.
$ proxyprobe proxies.txt --geo
PROXY OK MS EXIT IP ANONYMITY LOCATION ERROR
--------------------------------- --- ---- --------------- ----------- -------------- ---------------------
http://user:***@gw.example.com:80 yes 312 203.0.113.44 elite Tokyo Japan
socks5://198.51.100.7:1080 yes 1180 198.51.100.7 transparent Frankfurt Germany
http://10.0.0.9:3128 no - - - ConnectTimeout: timed out
2/3 working | 312ms median | 1 elite, 1 transparentMost "proxy checker" scripts only tell you whether a connection opened. That is the least interesting thing about a proxy. proxyprobe also answers the questions that actually decide whether a proxy is usable:
- Does it leak my real IP? Graded
transparent/anonymous/eliteby comparing your direct IP against what the proxy forwards, and by inspectingVia,X-Forwarded-Forand friends. - Where does it actually exit? The advertised location and the real one often differ.
- How slow is it really? Measured on a full request, not a TCP handshake.
pip install "httpx[socks]"
curl -O https://raw.githubusercontent.com/roamproxy/proxyprobe/main/proxyprobe.py
python proxyprobe.py proxies.txtIt is a single file with no packaging required. Drop it in a repo, a container, or a CI job and run it.
proxyprobe proxies.txt # table output
proxyprobe proxies.txt --json # machine readable
proxyprobe proxies.txt --geo # add country/city
proxyprobe proxies.txt --working-only # drop the dead ones
cat proxies.txt | proxyprobe - # read stdin
proxyprobe proxies.txt -c 100 -t 5 # 100 in parallel, 5s timeoutProxy list format — one per line, # comments and blank lines ignored:
http://user:pass@host:8080
socks5://host:1080
host:8080 # scheme defaults to http
| Flag | Description |
|---|---|
-c, --concurrency |
Parallel checks (default 20) |
-t, --timeout |
Per-request timeout in seconds (default 10) |
--json |
JSON instead of a table |
--geo |
Look up country/city (rate limited, so opt-in) |
--working-only |
Only output proxies that responded |
--echo-url |
IP echo endpoint (default api.ipify.org) |
--headers-url |
Header echo endpoint used for anonymity grading |
--geo-url |
Geo lookup template, must contain {ip} |
-q, --quiet |
Suppress the progress counter |
Exit code is 0 if at least one proxy worked, 1 if none did — so it drops straight
into CI or a shell pipeline:
proxyprobe proxies.txt --working-only --json > alive.json || echo "all proxies down"| Grade | Meaning |
|---|---|
elite |
Request looks like an ordinary direct request |
anonymous |
Real IP hidden, but headers announce a proxy is in use |
transparent |
Your real IP is visible through the proxy |
Grading needs a baseline, so proxyprobe first fetches your direct IP once. If that
fails it degrades safely: a proxy is never labelled transparent without a baseline
to compare against.
Credentials are stripped from every output path, so results are safe to paste into an issue or a CI log:
http://user:hunter2@host:80 -> http://user:***@host:80
Passwords containing @ and : are handled correctly.
By default proxyprobe talks to api.ipify.org (IP echo), httpbin.org (header echo)
and, only with --geo, ip-api.com. All three are overridable — point them at your
own endpoints if you would rather not route a proxy list through third parties:
proxyprobe proxies.txt --echo-url https://your-host/ip --headers-url https://your-host/headersNothing else is sent anywhere. There is no telemetry.
pip install "httpx[socks]" pytest
pytest -qMIT — see LICENSE.
Maintained by Roam, a residential and datacenter proxy provider. proxyprobe works with any proxy from any provider, and always will — we built it because we needed it ourselves.