maximilianfeix/proxy-scraper
Free proxies that actually work: 700+ sources, every hit verified (honeypots, injected scripts, TLS), a live list every hour, a rotating proxy server and an MCP server for AI agents. - maximilianfe...
20 stars · 2 forks
README
Install · Live list · For AI agents · Proxy server · How it works · Recipes · Options · FAQ
Most free proxy lists are 95 % dead, and a good part of the rest are honeypots or proxies that inject scripts into your pages. proxy-scraper collects public HTTP, SOCKS4 and SOCKS5 proxies from 700+ sources and keeps only the ones that pass every check. It learns with every run which sources are worth it, and it can turn the result into a single rotating proxy.
Table of contents
Install Live proxy list For AI agents (MCP) Features · Why not just download a list? Examples Recipes Rotating proxy server Discord bot How it works Output Options GitHub Actions FAQ Roadmap · Contributing · Acknowledgements
Install With pipx (recommended – gives you a proxy-scraper command in its own environment): pipx install proxy-scraper-cli proxy-scraper The package is called proxy-scraper-cli on PyPI (the plain name is taken), the command is proxy-scraper.
Other ways: Docker, pip, a faster event loop, or straight from the repo
Docker – learned state and results stay in two folders next to you
mkdir -p proxy-data results docker run --rm --user "$(id -u):$(id -g)" -v "$PWD/proxy-data:/data" -v "$PWD/results:/work/results" \ ghcr.io/maximilianfeix/proxy-scraper --want 50 --https-onlypip into the current environment
pip install proxy-scraper-clioptional: faster event loop on macOS/Linux
pipx install "proxy-scraper-cli[fast]"the latest main instead of the latest release
pipx install git+https://github.com/maximilianfeix/proxy-scraper.gitno install at all
git clone https://github.com/maximilianfeix/proxy-scraper.git cd proxy-scraper pip install -r requirements.txt python3 proxy_scraper.py Every release also ships a wheel you can install with pip install <file>.whl, and a multi-arch image (amd64/arm64) on ghcr.io. In the container the wizard never shows up, it runs straight away. For the proxy server use --serve --serve-host 0.0.0.0 with -p 127.0.0.1:8899:8899, so the port is only open on your own machine. Tab completion for bash, zsh, fish and PowerShell: eval "$(proxy-scraper --completion zsh)" # in ~/.zshrc (after compinit), same for bash in ~/.bashrc proxy-scraper --completion fish > ~/.config/fish/completions/proxy-scraper.fish proxy-scraper --completion powershell | Out-String | Invoke-Expression # in $PROFILE Installed, the learned state lives in your user data folder (~/Library/Application Support/proxy-scraper, %LOCALAPPDATA%\proxy-scraper or ~/.local/share/proxy-scraper; override with PROXY_SCRAPER_HOME) and results go to ./results. Run from a clone, both stay inside the project.Started without arguments, a wizard asks what you are looking for:
Preset What it does
Find everything all protocols, maximum yield
Browsing & web HTTP + SOCKS5, HTTPS-capable, at least anonymous, under 3 s
Maximum anonymity elite SOCKS5 with HTTPS only
Fast & stable proxies under 1 s only
A few right now stops after 25 hits
Recheck the last hits no collecting, takes seconds
Proxy server right away recheck the last hits, then serve them on :8899
Same as last time your previous choice
Custom … protocols, countries, anonymity, HTTPS, target site, latency, amount, check mode
Keys: ↑↓ select · Space toggle · 1–9 jump · Enter next · Esc back · q quit. In scripts and cron jobs the wizard never shows up – pass options or -y.
Live proxy list Don't want to scan yourself? Every hour GitHub Actions runs the tool and publishes the hits to the proxy-list branch – every entry worked in the last run, fastest first.
→ Browse it on the website – search, filter by type, country, HTTPS, provider and latency, see how long each proxy has been up and how often it was on the list this week, copy or download exactly the proxies you need. Every protocol and country also has its own page with a plain download, e.g. SOCKS5 or Germany (country/de/proxies.txt).
List Format Link
All socks5://1.2.3.4:1080 all.txt
HTTP · SOCKS4 · SOCKS5 1.2.3.4:8080 http.txt · socks4.txt · socks5.txt
HTTPS-capable only type://ip:port https.txt
Elite only type://ip:port elite.txt
Gets through to Google · Reddit · Amazon · Instagram · TikTok (no captcha, no block in the last run) type://ip:port google.txt · reddit.txt · amazon.txt · instagram.txt · tiktok.txt
Stable, on the list in 90 %+ of this week's runs type://ip:port stable.txt
With all details latency, country, HTTPS, anonymity, exit IP, uptime, sites proxies.json · proxies.csv
curl -s https://raw.githubusercontent.com/maximilianfeix/proxy-scraper/proxy-list/socks5.txt | head Over time: every day the first run's proxies.json is kept for good as a gzipped asset of the release of that year, like snapshots-2026 – proxies-2026-09-28.json.gz and so on, for anyone who wants to look at free proxies over weeks and months. Every file is also on GitHub Pages, which sits behind a CDN, isn't rate limited like raw.githubusercontent and sends CORS headers, so it works straight from the browser: https://maximilianfeix.github.io/proxy-scraper/socks5.txt. jsDelivr works too, but can lag behind by a few hours. Or let the tool start from it: proxy-scraper --recheck live downloads the list and checks it again from your network – about 30 seconds instead of a full scan (517 of 1,169 worked from here). With --serve you have a rotating proxy in under a minute.
For AI agents (MCP)
proxy-scraper-mcp is an MCP server: Claude Code, Claude Desktop, Cursor, VS Code, Codex and any other MCP client can ask for working proxies and load pages through them.
Tool What it does
get_proxies working proxies right now, from the hourly list – filter by protocol, country, HTTPS, elite, no datacenter, not blocklisted, stable, uptime, latency, gets through to Google/Reddit/Amazon
check_proxies checks proxies from your own network, so they work from where your code runs (30–90 s, reports progress)
fetch_url loads a page through a verified proxy, switches proxies by itself when one fails, returns readable text – HTTPS only through proxies with verified TLS
Things to ask your agent: "Load bbc.com/news as seen from the UK", "Give me 5 SOCKS5 proxies from Germany that aren't in a datacenter", "Check which of these sites block free proxies". Needs uv – it fetches a suitable Python by itself if yours is older than 3.10. Claude Code: claude mcp add proxy-scraper -- uvx --python ">=3.10" --from "proxy-scraper-cli[mcp]" proxy-scraper-mcp Claude Desktop, Cursor and most other clients – add this to the MCP config (Claude Desktop: Settings → Developer → Edit Config, Cursor: ~/.cursor/mcp.json): { "mcpServers": { "proxy-scraper": { "command": "uvx", "args": ["--python", ">=3.10", "--from", "proxy-scraper-cli[mcp]", "proxy-scraper-mcp"] } } }
VS Code, Codex, or without uv VS Code – .vscode/mcp.json: { "servers": { "proxy-scraper": { "type": "stdio", "command": "uvx", "args": ["--python", ">=3.10", "--from", "proxy-scraper-cli[mcp]", "proxy-scraper-mcp"] } } } Codex – ~/.codex/config.toml: [mcp_servers.proxy-scraper] command = "uvx" args = ["--python", ">=3.10", "--from", "proxy-scraper-cli[mcp]", "proxy-scraper-mcp"] Without uv: pipx install --python python3.12 "proxy-scraper-cli[mcp]" (any Python 3.10+), then use proxy-scraper-mcp as the command. It's also in the official MCP registry as io.github.maximilianfeix/proxy-scraper, so clients that browse the registry can install it from there.
The server tells agents what it tells you: free proxies are run by strangers, so no logins, cookies or personal data through them. Local and private addresses are refused, and results go to proxy-scraper's data folder, not into the project you're working in.
Features
Setup wizard Started without arguments, the tool asks what you need using the arrow keys – a preset or step by step. At the end it shows the matching command line.
Fast 700+ sources fetched in parallel, large lists parsed on all CPU cores, hand-written HTTP/SOCKS handshakes directly on asyncio with 2000+ checks at once.
Real verification Every hit has to fetch two independent pages – that weeds out honeypots that only answer check requests (in some runs 5 out of 6 “hits”). A third request catches proxies that tamper with content: in our measurements one in five working proxies injected a script into a plain HTML page. Plus: HTTPS through a tunnel with verified TLS, anonymity level elite / anonymous / transparent and the country of the exit IP.
Learns with every run Hit rate per source, history of working proxies, automatic removal of dead and stale lists. With -l 5000 you get the best 5000 candidates, not just any.
Finds new sources by itself Searches GitHub for actively maintained proxy lists and reads source lists maintained by others. Spam clone farms and plain mirrors are detected.
Filters & target sites With --target google.com a proxy only counts if it really reaches the site – many public proxies are blocked by Google, Discord & co. Filter by country, HTTPS, anonymity and latency, and stop with --want 50 as soon as enough matching proxies are found. Filters even speed things up: with --max-latency 1000 slow proxies are given up after 1 s instead of 8 s.
Live dashboard Speed chart, latency histogram, protocols, countries and the latest hits in real time. Ctrl+C stops at any time and saves everything.
Rotating proxy server --serve turns the hits into a local proxy that sends every connection through a different one – with automatic failover when one hangs.
Runs everywhere macOS, Linux and Windows, Python 3.9 to 3.13. Only two dependencies: rich and certifi. It even notices when a firewall blocks proxies.
Thoroughly tested 450+ tests run offline against real mini proxies and honeypots on localhost – on Linux, macOS and Windows with Python 3.9, 3.11 and 3.13.
Why not just download a list?
Typical proxy list repo proxy-scraper
Proxies checked right before you use them ❌ ✅
Honeypots that fake a successful check filtered out ❌ ✅
Proxies that inject scripts or ads filtered out ❌ ✅
HTTPS tested with verified TLS rarely ✅
Anonymity level and country per proxy sometimes ✅
Only proxies that reach your target site ❌ ✅ --target
Learns which sources are worth it ❌ ✅
Usable as a single rotating proxy ❌ ✅ --serve
Ready-made list without running anything ✅ ✅ live list
Examples
50 proxies that can do HTTPS – then stop
proxy-scraper --want 50 --https-onlyonly Germany, Austria and Switzerland, the 20,000 most promising candidates
proxy-scraper --country DE,AT,CH -l 20000fast elite SOCKS5 proxies
proxy-scraper --types socks5 --anonymity elite --max-latency 150020 proxies that really reach Google AND Discord
proxy-scraper --target google.com --target discord.com --want 20only recheck the last hits (plus history) – takes seconds
proxy-scraper --recheckwizard with defaults – it keeps what you already passed
proxy-scraper -i --country DEwhich sources deliver the most?
proxy-scraper --list-sources Running from a clone? Replace proxy-scraper with python3 proxy_scraper.py.From Python from proxyscraper import check_proxies, find_proxies
if _name_ == "_main_": # needed on macOS/Windows, the parser uses a process pool for p in find_proxies(want=20, https=True, countries=["DE", "NL"], no_datacenter=True): print(p.url, p.latency, p.country, p.org)
alive = check_proxies(["socks5://1.2.3.4:1080", "5.6.7.8:3128"]) # your own list Same run as the command line – sources, learning, every check, result files – just without terminal output. Each result has url, latency, exit_ip, https, anonymity, country, asn, org and hosting. There's an async version of both (find_proxies_async, check_proxies_async). Don't need a fresh scan? live_proxies takes the live list instead – no checks, one download, done in about a second: import itertools, requests from proxyscraper import live_proxies
proxies = live_proxies(types=["socks5"], https=True, min_uptime=90) # the reliable ones this week pool = itertools.cycle(p.url for p in proxies) r = requests.get("https://api.ipify.org", proxies={"https": next(pool)}, timeout=15) # pip install "requests[socks]" Same filters as find_proxies, plus min_uptime, works_on (["google"], "reddit", "amazon", "instagram", "tiktok") and limit. Every result also has uptime_24h, uptime_7d, first_seen, up_for_hours and sites.
Rotating proxy server A list is nice – but usually you just want to enter one proxy that always works: proxy-scraper --recheck --serve # recheck the last hits, then go – takes seconds curl -x http://127.0.0.1:8899 https://api.ipify.org # a different IP every time curl -x socks5h://127.0.0.1:8899 https://api.ipify.org # SOCKS5 on the same port curl -x http://country-de:x@127.0.0.1:8899 https://api.ipify.org # only German exits curl -x http://session-cart42:x@127.0.0.1:8899 https://shop.example # same proxy for this session curl http://127.0.0.1:8899/__proxy-scraper/status # pool and counters as JSON curl http://127.0.0.1:8899/__proxy-scraper/metrics # the same for Prometheus/Grafana Like commercial rotating proxies, the username carries what you want: country-XX, type-http|socks4|socks5 and session-NAME, combinable (country-us-type-socks5-session-a). It works for HTTP (Proxy-Authorization) and SOCKS5 (username/password auth). By default the password is ignored and the server only listens on 127.0.0.1. To reach it from other machines, give it a password – every client then has to send it, over HTTP and SOCKS5 alike, and the status page wants it as Basic auth: export PROXY_SCRAPER_SERVE_PASSWORD=$(openssl rand -hex 16) # the env var keeps it out of `ps` proxy-scraper --recheck --serve --serve-host 0.0.0.0 curl -x "http://country-de:$PROXY_SCRAPER_SERVE_PASSWORD@your-server:8899" https://api.ipify.org Without a password, --serve-host means anyone who reaches the port can use it. The ready-made compose.yaml starts the server in Docker from the live list, with a password, a health check and learned state in a volume: put PROXY_PASSWORD=… into .env, then docker compose up -d.
Option What it does
--rotate weighted default: fast and proven proxies more often, everyone gets a chance
--rotate random / round-robin evenly, at random or in turn
--rotate fastest always the fastest one that isn't busy
--sticky 300 the same site keeps its proxy for 5 minutes (logins, carts)
every connection goes through a different proxy (unless sticky); fast and proven ones are preferred CONNECT for HTTPS and plain HTTP requests; HTTP, SOCKS4 and SOCKS5 proxies can sit behind it (SOCKS5 with DNS through the proxy) HTTPS only uses proxies that passed the test with verified TLS – no broken encryption if a proxy stays silent inside the tunnel or returns an error page instead of TLS, the same first packet quietly goes to the next one three failures in a row and a proxy leaves the rotation – every 5 minutes those get re-checked and come back if they work again --serve-refill 6 checks fresh proxies every 6 hours in the background (the live list with --recheck live, otherwise the last run + history) with the same checks and filters, and adds the hits – a server that runs for days doesn't run dry listens on 127.0.0.1 only (unless --serve-host says otherwise), optionally with a password; live view with requests, success rate, pool and the latest connections
In testing: 20 of 20 HTTPS requests succeeded, over 15 different exit IPs. In the wizard this is Proxy server right away.
Discord bot The live list can also come to you: bot/ is a Discord bot that posts every run into a server – a summary with the fastest proxies, the full lists per protocol as files, and slash commands like /proxies type:socks5 country:DE https:true. It sets up its own read-only channels when you invite it, and a GitHub Action deploys it to a server as a systemd service. Setup in bot/README.md.
How it works
flowchart LR A[sources.json<br/>meta lists<br/>GitHub discovery] --> B[Fetch & parse<br/>in parallel on all cores] B --> C[Prioritize<br/>history → good sources → rest] C --> D[Check<br/>HTTP · SOCKS4 · SOCKS5] D --> E[Details<br/>HTTPS · anonymity · country] E --> F[results/] D -. hit rate per source .-> G[(learned state)] G -. next run .-> C
Loading
Sources – the curated list in sources.json, meta sources (other projects that maintain lists of proxy sources) and, once a day, a GitHub search for actively maintained repos. Every search adds to what earlier ones found; a list the search hasn't seen for three weeks drops out. Collect – plain text, HTML tables, JSON APIs and type://ip:port lines are recognized; private and reserved address ranges are dropped. Lists that haven't changed since the last run answer 304 and come from a local cache – a second run right after the first loads 0 MB instead of ~160 MB. Prioritize – known working proxies first, then by the learned hit rate of their sources. Check – every proxy has to fetch its exit IP from a check target (checkip.amazonaws.com, with ifconfig.me, ipinfo.io, wtfismyip.com and ident.me as reserves – none of them behind Cloudflare) and return a valid, foreign IP. If the target goes down mid-run, the tool switches and re-checks the proxies that were affected, so the statistics don't learn from an outage. Anyone passing your own IP through is out. Then comes the confirmation via httpbin.org: fake proxies that only answer the first check with “200 + IP” fail here. Finally a static HTML page has to arrive byte for byte as it does without a proxy – anyone injecting ads or scripts is out. Countries and providers – looked up offline in the free DB-IP databases, including the provider (ASN) and whether it's probably a datacenter (about 45 % of working proxies are) (downloaded once a month, ~2 µs per lookup); ip-api.com is only asked for the few addresses it doesn't know. Blocklists – one DNS lookup per exit IP against SpamCop, cached for the run: about 29 % of working proxies exit from a listed IP, and sites that use the list show those captchas or block them. --no-blocklisted drops them. If your DNS resolver is refused by SpamCop (large public resolvers are), the lookup is skipped instead of guessing. Learn – hit rates and history are stored. Sources without hits, with content unchanged for a week or permanently unreachable are skipped.
📸 See the live dashboard and final report
Output Every run gets its own folder; results/latest.txt always names the newest one (on macOS/Linux there is also the symlink results/latest): results/2026-09-24_18-42-07/ ├── all.txt socks5://203.0.113.10:1080 (fastest first) ├── http.txt 203.0.113.20:8080 (plain ip:port lists per type) ├── socks4.txt ├── socks5.txt ├── proxies.json latency, country, HTTPS, anonymity, exit IP └── proxies.csv
Recipes Use the fastest proxy from the last run – free proxies die quickly, so --recheck first if the run is older than a few minutes proxy-scraper --recheck -y curl -x "$(head -1 results/latest/all.txt)" http://api.ipify.org For HTTPS, pick a proxy with "https": true from proxies.json – like the Python example below does. Python requests (pip install "requests[socks]" for SOCKS) import json from pathlib import Path
import requests
run = Path("results") / Path("results/latest.txt").read_text().strip() # works on every OS proxies = json.loads((run / "proxies.json").read_text()) # fastest first
for p in proxies: if not p["https"]: continue try: r = requests.get("https://api.ipify.org", proxies={"http": p["url"], "https": p["url"]}, timeout=8) print(p["url"], "→", r.text) break except requests.RequestException: continue # free proxies come and go – just take th