Free tool · no account
Proxy format
converter.
Paste a list in whatever shape your provider handed you. Get it back in the shape your tool actually wants — host:port, user:pass@host:port, a proxy URL, curl, JSON, CSV, or a template you write yourself.
- ✓ Runs in your browser
- ✓ Nothing uploaded
- ✓ No signup, no limit
- ✓ Mixed formats in one paste
What every HTTP client, browser flag and library actually consumes.
Paste your list
Output · Proxy URL
Nothing pasted yet
Your list is parsed by JavaScript on this page and never sent anywhere — there is no server behind this tool to send it to. Proxy credentials are credentials; a converter that uploads them is one you should not be using.
Nobody agreed
on a format.
A proxy is four values: a host, a port, and usually a username and password. There is no
standard for writing them down, so every provider picked something. One panel exports host:port:user:pass. The next writes user:pass@host:port. Your HTTP client wants a URL with a
scheme on the front. Your browser automation wants the host and port on their own, with the
credentials passed through a separate API entirely.
None of this is difficult, which is exactly why it is annoying — it is a text-shuffling chore that sits between you and the work, usually at the point where you have just paid for something and want to use it. The converter above reads every one of the shapes below, decides per line rather than per paste, and writes out any other one.
Every format it reads and writes
host:port
The bare pair. Anything authenticated by IP whitelist wants this.
203.0.113.10:8080host:port:user:pass
The most common list format. Most sneaker and checker tools expect it.
203.0.113.10:8080:alice:s3cretuser:pass@host:port
A URL with the scheme left off. Common in browser and anti-detect panels.
alice:[email protected]:8080user:pass:host:port
The inverted four-field order. A handful of resellers export this way.
alice:s3cret:203.0.113.10:8080host:port@user:pass
Rare, but some panels emit it and almost nothing else parses it.
203.0.113.10:8080@alice:s3cretProxy URL
What every HTTP client, browser flag and library actually consumes.
http://alice:[email protected]:8080curl
One ready-to-run request per proxy, for checking a list by hand.
curl -x "http://alice:[email protected]:8080" https://api.ipify.orgShell env vars
HTTP_PROXY / HTTPS_PROXY exports for a terminal or Dockerfile.
export HTTP_PROXY="http://alice:[email protected]:8080" HTTPS_PROXY="http://alice:[email protected]:8080"Python requests
A proxies list you can paste straight into a requests session.
PROXIES = [
{"http": "...", "https": "..."},
]JSON
One object per proxy — for config files and your own tooling.
[
{
"protocol": "http",
"host": "203.0.113.10",
"port": 8080
}
]CSV
Header row plus one row per proxy, for a spreadsheet or a database load.
protocol,host,port,username,password
http,203.0.113.10,8080,alice,s3cretCustom template
Your own layout. Use {scheme} {host} {port} {user} {pass} as placeholders.
{host}|{port}|{user}|{pass}Input detection also handles CSV, TSV, spreadsheet rows, curl commands, HTTP_PROXY lines and quoted URLs pasted out of JSON or Python.
Which one does
your tool want?
The most common way a working proxy looks broken is being handed to a client in a shape it
does not parse. Chrome is the classic: --proxy-server silently ignores credentials, so an authenticated proxy pasted into it fails as though the
proxy were dead. Here is what each client actually expects.
curl, wget
Proxy URL
curl -x "http://user:pass@host:8080" https://example.com Quote the URL — a password containing & or ! will otherwise be eaten by your shell.
Python requests, httpx
Proxy URL
proxies={"http": "http://user:pass@host:8080", "https": "..."} Both keys point at the same proxy. The "https" key sets the proxy for HTTPS targets, not an HTTPS proxy.
Node — axios, undici, got
Proxy URL
new HttpsProxyAgent("http://user:pass@host:8080") Node has no built-in proxy support for fetch; you need an agent library.
Scrapy
Proxy URL
request.meta["proxy"] = "http://user:pass@host:8080" Set it per request in meta, not in settings.py, if you are rotating.
Chrome, Puppeteer, Playwright, Selenium
host:port
--proxy-server=http://host:8080 The Chrome flag will not accept credentials. Username and password have to be supplied separately, through the browser API.
Anti-detect browsers — Multilogin, AdsPower, GoLogin
Separate fields
host · port · username · password Most also accept a pasted user:pass@host:port and split it for you.
Sneaker bots, checkers, most GUI tools
host:port:user:pass
203.0.113.10:8080:alice:s3cret The default list format in this corner of the ecosystem. Rarely documented, almost always expected.
Shell-wide, Docker, CI
Environment variables
export HTTP_PROXY="http://user:pass@host:8080" Set HTTPS_PROXY too. Most clients read both, and some read only one.
Questions,
answered properly.
Is my proxy list uploaded anywhere?
No. The converter is JavaScript running in your browser — the list never leaves the page. There is no upload, no request to our servers, no logging and no storage, so closing the tab discards everything. You can confirm it by opening your network tab, or by disconnecting from the internet after the page loads: it keeps working.
Which input formats does it detect?
host:port, host:port:user:pass, user:pass:host:port, user:pass@host:port, host:port@user:pass, and full proxy URLs with an http, https, socks4 or socks5 scheme. It also reads CSV, TSV and spreadsheet rows, curl commands, HTTP_PROXY environment lines and quoted URLs pasted out of JSON or Python. Detection runs per line, so a list that mixes several formats converts in one pass.
What is the difference between host:port:user:pass and user:pass@host:port?
Nothing but the writing. They carry the same four values, and the converter treats them as identical. The colon-separated form is what proxy sellers and GUI tools tend to export; the @ form is a proxy URL with the scheme left off, which is what HTTP clients and libraries expect.
How does it tell host:port:user:pass from user:pass:host:port?
Both are four colon-separated fields and neither is labelled, so the converter scores each reading on how host-like the candidate host is. An IP address is decisive, a dotted hostname is strong evidence, and a bare word is weak because usernames look the same. When both readings score equally it picks host-first, which is the more common of the two. The Detected line under the panes tells you which shape it settled on for every line.
My password contains @ or : — will that break the conversion?
No. Credentials are split on the first colon and the address on the last @, so a password containing either character survives the round trip. When the output is a proxy URL, curl command, environment variable or Python snippet, the username and password are percent-encoded, because an unencoded @ or / in a password produces a URL that silently parses to the wrong host.
Can it convert IPv6 proxies?
Yes, with the address in square brackets: [2001:db8::1]:8080. Brackets are required rather than optional, because a bare IPv6 address is itself full of colons and cannot be told apart from the separators. A line that looks like an unbracketed IPv6 address is reported with that specific advice rather than a generic failure.
What is the difference between socks5 and socks5h?
Where DNS resolution happens. With socks5 your own machine resolves the hostname and sends the resulting IP to the proxy; with socks5h the proxy resolves it. Use socks5h when the target should never see a DNS lookup from your network, or when the hostname only resolves correctly from the proxy location.
Why did one of my lines fail?
Every line that cannot be read is listed underneath with its original line number, the text as pasted and the specific reason — a port outside 1–65535, a host that is not a valid address or hostname, or a field count that does not resolve. Nothing is dropped silently, because a list that comes back shorter than it went in is the most expensive way this tool could fail you.
Does the output keep my credentials?
Only when the format you pick has somewhere to put them. host:port cannot carry a username and password, so choosing it drops them, and the page says so with a count of the affected lines. The Strip credentials switch does the same thing deliberately, which is what you want before sharing a list or filing a support ticket.
Is there a limit on list size?
The first 20,000 lines of a paste are converted. Anything beyond that is reported as ignored rather than quietly cut, so you know to split the list. There is no account, no signup and no rate limit — the work happens on your own machine.
Now get proxies
worth converting.
Dedicated ISP and residential IPs on real carrier subnets, priced in the open and provisioned in under two minutes. $1 gets you a trial.