proxyprobe
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 transparent
Most "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.
Install
pip install "httpx[socks]"
curl -O https://raw.githubusercontent.com/roamproxy/proxyprobe/main/proxyprobe.py
python proxyprobe.py proxies.txt
It is a single file with no packaging required. Drop it in a repo, a container, or a CI job and run it.
Usage
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 timeout
Proxy list format — one per line, # comments and blank lines ignored:
http://user:pass@host:8080
socks5://host:1080
host:8080 # scheme defaults to http
Options
| 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"
Anonymity grades
| 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.
Passwords are masked
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.
Privacy
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/headers
Nothing else is sent anywhere. There is no telemetry.
Development
pip install "httpx[socks]" pytest
pytest -q
License
MIT — 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.
Release files for proxyprobe 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| proxyprobe-0.1.1.tar.gz | 9.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| proxyprobe-0.1.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 18.2 kB
Release files / proxyprobe-0.1.1.tar.gz
| Download URL | proxyprobe-0.1.1.tar.gz |
|---|---|
| Size | 9.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1e427a9af6f5f0e30bc0dd70537211aa72112d3801f4740fc15b3e5a49437010
|
|
BLAKE2b-256 checksum How to use checksums |
f9287b8973153929b8091b55d41824ba2fa585a418b40b0f815ca6d1388e1767
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Release files / proxyprobe-0.1.1-py3-none-any.whl
| Download URL | proxyprobe-0.1.1-py3-none-any.whl |
|---|---|
| Size | 8.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6277c62ea92d289a6ff5245a6b8748844cf3ae58f99658f982387161f8132c9d
|
|
BLAKE2b-256 checksum How to use checksums |
3725921028282c0cb9d677a52537d4e6f3206f837986f09a67445f91f1a66a0d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|