Fixing net::ERR_NO_SUPPORTED_PROXIES
Chrome takes a proxy as scheme, host and port, nothing else. A login in the flag or socks5h:// fails at once, and SOCKS5 with a login doesn't work at all.
In short
Remove the username and password from --proxy-server and write socks5://, not socks5h://. For a proxy that needs a login, use its HTTP port with page.authenticate(): Chrome can’t send a SOCKS5 login at all. If it has to be SOCKS5, put a local forwarder in between.
--proxy-server takes a scheme, a host and a port. Anything Chrome can’t turn into a proxy it knows makes every request fail before a connection is even tried, with this error in Puppeteer:
Error: net::ERR_NO_SUPPORTED_PROXIES at https://ipinfo.io/jsonWe launched Chrome 156 through Puppeteer with each value against our gateway (SOCKS5 on port 11000, HTTP on 9000):
| --proxy-server | Login | Result |
|---|---|---|
socks5://USER:PASS@…:11000 | in the flag | net::ERR_NO_SUPPORTED_PROXIES |
http://USER:PASS@…:9000 | in the flag | net::ERR_NO_SUPPORTED_PROXIES |
socks5h://…:11000 | page.authenticate() | net::ERR_NO_SUPPORTED_PROXIES |
socks5://…:11000 | page.authenticate() | net::ERR_SOCKS_CONNECTION_FAILED |
socks5://…:11000 | none | net::ERR_SOCKS_CONNECTION_FAILED |
http://…:9000 | none | net::ERR_INVALID_AUTH_CREDENTIALS |
http://…:9000 | page.authenticate() | 200 |
A login in the flag
Chrome doesn’t read credentials out of --proxy-server, for HTTP or SOCKS. It rejects the whole value instead of ignoring the login. Keep the flag to http://host:port and hand the login over separately.
socks5h is a curl word
socks5h:// tells curl and Python to let the proxy resolve hostnames. Chrome doesn’t know the scheme and refuses it. Write socks5://: Chromium’s proxy documentation says it hands hostnames to a SOCKS5 proxy to resolve anyway.
No login over SOCKS5
With a clean socks5://host:port Chrome connects, the proxy asks for a username and password, and Chrome has none to give: ERR_SOCKS_CONNECTION_FAILED. page.authenticate() doesn’t help, it only answers HTTP proxies. Over HTTP the same login works, which is why the last row is the only one that loads. More Puppeteer proxy errors.
Playwright doesn’t get as far as a navigation. Given a SOCKS5 proxy with a username, it refuses to launch the browser, and not only Chromium:
Selenium drives the same Chrome and hits the same wall; what works there.
Two setups that work
Both ran unchanged with Node 24 against our gateway. PROXY_USER and PROXY_PASS come from the environment.
1. Use the HTTP port
The simplest fix when the provider has one. The login goes through page.authenticate(), never into the flag.
import puppeteer from "puppeteer"; // npm i puppeteer
// No SOCKS needed: the HTTP port takes the login through page.authenticate().
const browser = await puppeteer.launch({ args: ["--proxy-server=http://via.proxies.vision:9000"] });
try {
const page = await browser.newPage();
await page.authenticate({ username: `${process.env.PROXY_USER}-country-de`, password: process.env.PROXY_PASS });
await page.goto("https://ipinfo.io/json");
console.log(await page.evaluate(() => document.body.innerText));
} finally {
await browser.close();
}2. Keep SOCKS5, add a local forwarder
proxy-chain opens a proxy on 127.0.0.1 without a login and forwards everything to the SOCKS5 proxy with it. Chrome only ever sees the local address.
import puppeteer from "puppeteer";
import { anonymizeProxy, closeAnonymizedProxy } from "proxy-chain"; // npm i puppeteer proxy-chain
const user = encodeURIComponent(`${process.env.PROXY_USER}-country-de`);
const pass = encodeURIComponent(process.env.PROXY_PASS);
// Chrome takes no login in --proxy-server and none at all for SOCKS5.
// proxy-chain opens a local proxy without a login that forwards to ours with it.
const local = await anonymizeProxy(`socks5://${user}:${pass}@via.proxies.vision:11000`);
const browser = await puppeteer.launch({ args: [`--proxy-server=${local}`] });
try {
const page = await browser.newPage();
await page.goto("https://ipinfo.io/json");
console.log(await page.evaluate(() => document.body.innerText));
} finally {
await browser.close();
await closeAnonymizedProxy(local, true);
}import { chromium } from "playwright";
import { anonymizeProxy, closeAnonymizedProxy } from "proxy-chain"; // npm i playwright proxy-chain
const user = encodeURIComponent(`${process.env.PROXY_USER}-country-de`);
const pass = encodeURIComponent(process.env.PROXY_PASS);
// Playwright refuses SOCKS5 with a username in every browser; hand it a local proxy instead.
const local = await anonymizeProxy(`socks5://${user}:${pass}@via.proxies.vision:11000`);
const browser = await chromium.launch({ proxy: { server: local } });
try {
const page = await browser.newPage();
await page.goto("https://ipinfo.io/json");
console.log(await page.innerText("body"));
} finally {
await browser.close();
await closeAnonymizedProxy(local, true);
}{
"city": "Köln",
"country": "DE",
…Targeting stays in the username, as anywhere else. For the same exit IP across pages, add a session and use the sticky port: USER-country-de-session-job1-lifetime-10 on 12000 for SOCKS5, 10000 for HTTP.
What does net::ERR_NO_SUPPORTED_PROXIES mean?
Does Chrome support SOCKS5 with a username and password?
Why does Playwright say 'Browser does not support socks5 proxy authentication'?
What is the easiest fix?
Keep reading
Playwright Proxy Errors: ERR_TUNNEL_CONNECTION_FAILED, NS_ERROR_PROXY_*
Every Playwright proxy error in Chromium and Firefox, what the proxy answered, the silent 30-second timeout on a wrong password, and SOCKS5 auth.
7 min read · #playwright#errors
aiohttp Proxy Errors: ClientHttpProxyError 407, SOCKS5 and trust_env
aiohttp's ClientHttpProxyError explained, why its message leaks your proxy password, socks5:// without aiohttp-socks, and rotation.
6 min read · #python#errors
curl: (56) CONNECT tunnel failed, response 407 (Received HTTP code 407 from proxy)
curl (56) 'CONNECT tunnel failed, response 407', or 'Received HTTP code 407 from proxy after CONNECT' in older curl: the cause, the fix, every exit code.
6 min read · #errors#authentication
Residential proxies, pay per GB
HTTP and SOCKS5. Country, city and sticky sessions in the username. No subscription.