Quick answer
How do I connect to a European city IP?
Send your requests to the EuroCity Proxies gateway with the city in the username, for example USERNAME-country-fr-city-paris, then read https://ipinfo.io/json to see the exit. As of October 2026, city targeting is on every plan and 1 GB costs $0.95. City availability varies; the checkout shows what is online.
What do you need before the first request?
| Gateway | gw.eurocityproxies.com |
|---|---|
| HTTP and HTTPS port | 7777 |
| SOCKS5 port | 7778 |
| Rotating username | USERNAME-country-fr-city-paris |
| Sticky username | USERNAME-country-fr-city-paris-session-paris1-ttl-10 |
| Check URL | https://ipinfo.io/json (IP, city, region, country, network) |
| Protocols | HTTP, HTTPS (CONNECT) and SOCKS5 |
How is the username built?
The username carries the targeting: your account username, then -country- with a lower-case ISO code, then optional segments. The country segment is always required, even when you add a city.
-city-paris: city id in lower case, without accents, with_instead of spaces or dashes (-city-the_hague).-asn-<number>: one network, for example a broadband provider; ASN targeting costs nothing extra (ASN guide).-session-paris1-ttl-10: a sticky session calledparis1that lasts up to 10 minutes. The ttl can go up to 30.
Country codes are lower case in the username but upper case in the API. The list of city ids for a country comes from GET /api/v1/catalog/countries/FR/cities, described in the API docs. Use the ids it returns; do not guess spellings such as kraków or münchen.
Does a rotating username change IP on every request?
It changes IP on every new connection, not on every request. Each new connection gets an IP from the pool, usually a different one; to get a new IP on every request, send one request per connection (turn off keep-alive).
This matters in code. A requests.Session, an httpx.Client or an undici agent keeps its tunnel open between requests, so the exit stays the same. For one IP per request, open a new client for each request or send Connection: close. For one IP across several requests on purpose, use a sticky session, explained in sticky sessions per city.
# Rotating exit in Paris (HTTP proxy, HTTPS target through CONNECT)
curl -s -x "http://USERNAME-country-fr-city-paris:[email protected]:7777" https://ipinfo.io/json
# Sticky exit in Paris: session paris1, up to 10 minutes
curl -s -x "http://USERNAME-country-fr-city-paris-session-paris1-ttl-10:[email protected]:7777" https://ipinfo.io/json
# SOCKS5 with socks5h: the proxy resolves the hostname, not your machine
curl -s -x "socks5h://USERNAME-country-fr-city-paris:[email protected]:7778" https://ipinfo.io/json
# Gateway alone, without a target site: prints only the exit IP
curl -s -x "http://USERNAME-country-fr-city-paris:[email protected]:7777" https://api.ipify.org# pip install requests
from urllib.parse import quote
import requests
HOST = "gw.eurocityproxies.com"
PORT = 7777
USER = "USERNAME-country-fr-city-paris-session-paris1-ttl-10"
PASSWORD = quote("PASSWORD", safe="") # encodes @, : and / in the password
proxy = f"http://{USER}:{PASSWORD}@{HOST}:{PORT}"
proxies = {"http": proxy, "https": proxy}
# proxies= on each call wins over HTTP_PROXY / HTTPS_PROXY set on your machine
r = requests.get("https://ipinfo.io/json", proxies=proxies, timeout=30)
r.raise_for_status()
info = r.json()
print(info["ip"], info.get("city"), info.get("country"), info.get("org"))# pip install httpx
from urllib.parse import quote
import httpx
USER = "USERNAME-country-fr-city-paris"
PASSWORD = quote("PASSWORD", safe="")
PROXY = f"http://{USER}:{PASSWORD}@gw.eurocityproxies.com:7777"
# One client keeps its connection open (keep-alive): the three lines show one IP
with httpx.Client(proxy=PROXY, timeout=30, trust_env=False) as client:
for _ in range(3):
print("same client:", client.get("https://ipinfo.io/json").json()["ip"])
# A new client per request opens a new connection: usually a different Paris IP
for _ in range(3):
with httpx.Client(proxy=PROXY, timeout=30, trust_env=False) as client:
print("new client: ", client.get("https://ipinfo.io/json").json()["ip"])// npm install undici
import { ProxyAgent, fetch } from "undici";
const user = "USERNAME-country-fr-city-paris-session-paris1-ttl-10";
const password = encodeURIComponent("PASSWORD");
const dispatcher = new ProxyAgent(
`http://${user}:${password}@gw.eurocityproxies.com:7777`
);
try {
const res = await fetch("https://ipinfo.io/json", {
dispatcher,
signal: AbortSignal.timeout(30000), // stop after 30 s
});
const info = await res.json();
console.log(info.ip, info.city, info.country, info.org);
} finally {
await dispatcher.close();
}# pip install "requests[socks]"
from urllib.parse import quote
import requests
HOST = "gw.eurocityproxies.com"
SOCKS_PORT = 7778
USER = "USERNAME-country-fr-city-paris"
PASSWORD = quote("PASSWORD", safe="")
# socks5h: the proxy resolves the hostname, not your machine
proxy = f"socks5h://{USER}:{PASSWORD}@{HOST}:{SOCKS_PORT}"
r = requests.get("https://ipinfo.io/json", proxies={"http": proxy, "https": proxy}, timeout=30)
print(r.json())Which details do these examples handle?
The examples handle the details that most often break a first connection:
- Encode the password.
quote("PASSWORD", safe="")in Python andencodeURIComponentin Node keep characters such as@or:from breaking the proxy URL. - Proxy variables on your machine. In requests, a value set in
session.proxiescan be overwritten byHTTPS_PROXY. Passproxies=on each call, or settrust_env = Falseon the session. - Always a timeout. Every example stops after 30 seconds instead of hanging.
- Top-level await needs a module. Save the Node example as
.mjs, and run it with Node.js 22 or newer. - socks5h, not socks5. With
socks5://, requests and curl look up the hostname on your machine. Withsocks5h://, the proxy resolves it.
Can I use the SOCKS5 port in a browser?
Use the HTTP port 7777 in browsers instead. The Chromium proxy documentation says Chrome supports no authentication method for SOCKS5. A username and password on port 7778 will not work there.
On an iPhone or iPad, Wi-Fi settings offer a manual HTTP proxy with authentication. For the Android emulator, start it with -http-proxy http://USERNAME-country-fr-city-paris:[email protected]:7777. The app geo-testing page covers devices in more detail.
What should the output show?
The JSON from https://ipinfo.io/json should show "country": "FR" and, most of the time, Paris or a town in the Paris area as city. The org field starts with the network's ASN, such as a French broadband provider.
A nearby town instead of Paris is normal: geolocation databases place many home IPs at the provider's local hub. The exit-city guide shows how to compare two sources, and why an IP shows a nearby town explains the causes.
Quickstart questions
Why does my request fail with 407 Proxy Authentication Required?
A 407 means the proxy did not accept the username or password. Check that the username starts with your account username, that -country- is present, and that special characters in the password are URL-encoded. Copy both values again from the dashboard.
Why do I get a German IP when I asked for Paris?
Usually a typo in the username, such as -country-de left from another test, or a city id that does not exist. Print the username before the request. If ipinfo.io and a second source both show another country, write to support with the time and the exit IP.
How long can a sticky Paris session last?
A sticky session keeps the same IP for up to 30 minutes (the IP can change earlier, for example if the residential device goes offline). Set the length with -ttl- in minutes, for example -ttl-10 or -ttl-30. Do not rely on a session to survive longer than the ttl you set.
Is city targeting an extra charge?
No. Country and city targeting on every plan; in the United States also state and ZIP code; ASN targeting at no extra cost. City availability varies. The price per GB is the same with or without a city. The pricing page lists $0.95 for 1 GB and $8 for 10 GB.
How much traffic does this quickstart use?
Very little: each request to https://ipinfo.io/json moves a few kilobytes, headers and TLS included. Usage counts all data sent and received through the proxy (upload and download, headers included). 1 GB = 1,000,000,000 bytes. Connection attempts that fail before reaching the target are not counted.
Can I log in with an IP allowlist instead of a password?
Yes. Username and password on every plan, or an IP allowlist (up to 10 IPs). Sub-users with their own credentials and traffic cap. API keys you can revoke at any time. The docs explain how to set the country and city when you connect from an allowlisted IP. The examples on this page use a username and password because they work from any machine.
How do I pay for the first gigabyte?
Pick a plan, then top up its price in BTC, USDT, USDC, ETH, SOL, LTC ($25 minimum). Send the exact amount and click I've sent the payment; the top-up is matched by its exact amount and credited once confirmed. No KYC: no ID, no selfie, no documents to sign up, top up or buy.
Sources (10)
- curl man page: --proxy, socks5h:// and --socks5-hostname — curl project (checked 2026-10-18)
- Requests: Advanced Usage, Proxies and SOCKS — Python Software Foundation / Requests (checked 2026-10-18)
- HTTPX: Proxies — Encode (checked 2026-10-18)
- undici ProxyAgent documentation — Node.js project (checked 2026-10-18)
- Node.js releases (supported release lines) — OpenJS Foundation (checked 2026-10-18)
- Proxy support in Chrome (SOCKSv5 authentication) — The Chromium Projects (checked 2026-10-18)
- Set up a proxy for the Android Emulator — Google / Android Developers (last updated 2026-03-12, checked 2026-10-18)
- Global HTTP Proxy device management payload settings (iOS, iPadOS: manual proxy with user name and password) — Apple Platform Deployment (checked 2026-10-18)
- RFC 9110 HTTP Semantics, section 9.3.6 CONNECT and status 407 — IETF (June 2022, checked 2026-10-18)
- IPinfo JSON endpoint — IPinfo (checked 2026-10-18)