DEV Community

Cover image for A free proxy list that's actually checked (HTTP/SOCKS4/SOCKS5, updated every 30 min)
Billy
Billy

Posted on

A free proxy list that's actually checked (HTTP/SOCKS4/SOCKS5, updated every 30 min)

Every "free proxy list" you find is the same story: a giant wall of ip:port lines, 90% of them already dead, no idea which are HTTP or SOCKS, no idea where they exit. You paste 500 into your scraper and three of them work.

So I put up a small one that's actually checked: gproxynet/free-proxy-list. A checker validates each proxy, tags it with protocol, country and latency, and the repo is regenerated every 30 minutes. It's a rotating sample, not a 50k dump — the point is that what's in it was alive minutes ago, not last month.

Grab it

Plain text, one ip:port per line, split by protocol:

curl -s https://raw.githubusercontent.com/gproxynet/free-proxy-list/main/all.txt
curl -s https://raw.githubusercontent.com/gproxynet/free-proxy-list/main/socks5.txt
Enter fullscreen mode Exit fullscreen mode

Or the structured version with protocol, country and latency:

curl -s https://raw.githubusercontent.com/gproxynet/free-proxy-list/main/proxies.json
Enter fullscreen mode Exit fullscreen mode
[
  {"proxy":"103.156.224.66:8080","protocol":"http","country":"ID","latency_ms":4225,"checked_at":"2026-07-04T09:34:16Z"},
  {"proxy":"185.26.180.180:80","protocol":"http","country":"NL","latency_ms":340,"checked_at":"2026-07-04T09:41:02Z"}
]
Enter fullscreen mode Exit fullscreen mode

Use it in Python

Filter to the protocol and speed you want:

import requests

proxies = requests.get(
    "https://raw.githubusercontent.com/gproxynet/free-proxy-list/main/proxies.json"
).json()

fast_socks5 = [
    p["proxy"] for p in proxies
    if p["protocol"] == "socks5" and (p["latency_ms"] or 9999) < 2000
]
print(len(fast_socks5), "fast SOCKS5 proxies")
Enter fullscreen mode Exit fullscreen mode

If you're rotating them across a scraper, feed the list straight into a pool. I use proxyspin (a small rotating pool with health tracking + ban detection), which can load a URL directly:

from proxyspin import ProxyPool
from proxyspin.requests_adapter import RotatingSession

pool = ProxyPool.from_url("https://raw.githubusercontent.com/gproxynet/free-proxy-list/main/all.txt")
session = RotatingSession(pool)          # dead ones get benched automatically
print(session.get("https://httpbin.org/ip").json())
Enter fullscreen mode Exit fullscreen mode

The honest part

These are public proxies. They're shared by strangers, they're slow, they die within minutes to hours, and you should never send anything sensitive through them. A checked list saves you the "which of these 500 is alive" step — it does not make public proxies reliable. They're great for testing, learning, one-off checks and throwaway requests.

The moment you need proxies that stay up — real scraping, account work, ad verification — you'll want dedicated ones (residential, mobile or datacenter) instead of public ones. But if a free, checked, auto-updating list is what you need today, it's there:

➡️ github.com/gproxynet/free-proxy-list

Bookmark the raw URL, poll it every so often, and you've always got a fresh handful to work with.

Top comments (0)