On this pageThe one rule: session ID + time tag, together
If your sticky proxy session is not working (the exit IP keeps changing when you expected it to stay the same), the cause is almost always a username that is missing one of the two tags a sticky session requires. ColdProxy sticky sessions need both a session tag and a time tag together; supply only one and the proxy rotates per request. This page shows the broken-versus-fixed username, the error for an invalid session or time value, the duration limits per product, and the SuperPort alternative so you can hold a single exit IP for your plan's sticky window.
The one rule: session ID + time tag, together
A sticky session is defined by two tags in the username at once: a -session-<n> tag that names the session (its session ID), and a -time-<dur> tag that sets how long the IP is held. Present both and the session keeps the same exit IP for its time window while that IP works. If the exit IP stops working, the session's IP may change. Present only one (or neither) and the proxy rotates to a fresh IP on every request. Each value must also be valid, or the proxy refuses the request with an error; see Invalid session or time value.
# BROKEN — only a session tag, no time tag -> rotates every request
user-key-myaccount-session-12345:PASSWORD
# FIXED — session AND time together -> 10-minute sticky session
user-key-myaccount-session-12345-time-10m:PASSWORDThe exact segment prefixes (for example the markers used for session and time) are configured per product by the admin. The grammar above is generic. Confirm the precise prefixes for your plan in your client area before hardcoding them.
Why a missing tag rotates
Rotating is the default behavior. Without an explicit session-plus-time pair, every request is treated as independent and gets the next available IP from the pool. That is exactly what you want for high-volume rotating workloads, but it breaks any flow that must keep the same IP across several requests: multi-step navigation, paginated collection from one origin, or a login that expects a stable source IP for an authorized session.
On Residential IPv6 and Datacenter IPv6, the client area's -identifier- pin is an alternative when you need the same IP without a timed window. Each generated identifier maps to one IP, with no stored session state. Use a session+time pair when you want a held window, and an identifier when you want the IP to stay the same. The Residential IPv4 plans do not support -identifier-, so use a session+time pair there.
Invalid session or time value (400 or 0x01)
The proxy refuses a request whose session or time tag has an invalid value. With HTTP or HTTPS, the response is 400 Bad Request; with SOCKS5, the reply is 0x01 (general failure). Your login was accepted, so this is not a credentials problem. Correct the tag and send the request again.
timemust be a positive whole number, optionally followed bys,m,h, ord, for example600,600s,10m,1h, or1d. An empty value,0, a decimal such as1.5h, or another unit such as10minis refused.FOREVERis not a time value either, so-time-FOREVERis refused; on the IPv6 plans, the FOREVER hold comes from the client area's-identifier-username.sessionmust be digits only, for example481516. An empty value or anything else, such asabc123, is refused.
# REFUSED — "min" is not a time unit -> 400 Bad Request / SOCKS5 0x01
user-key-myaccount-session-12345-time-10min:PASSWORD
# REFUSED — the session ID contains letters -> 400 Bad Request / SOCKS5 0x01
user-key-myaccount-session-abc123-time-10m:PASSWORD
# FIXED — a digits-only session ID and a valid time
user-key-myaccount-session-12345-time-10m:PASSWORDThree cases are not errors: a valid session or time tag on its own rotates, as described above; a valid time above your plan's maximum is shortened to that maximum; and a time of 1 to 4 seconds is raised to 5 seconds (see the limits below).
Sticky duration limits per product
The maximum hold time depends on the product:
| Product | Sticky range |
|---|---|
| Residential IPv4 (Unmetered) | 5s to 24h |
| Residential IPv4 (GB Based) | 5s to 24h |
| Residential IPv6 | 5s to FOREVER |
| Datacenter IPv6 | 5s to FOREVER |
On the two Residential IPv4 products, a time tag above 24h is shortened to 24h. On both IPv6 products you can hold an IP indefinitely with the client area's FOREVER option, which issues an -identifier- username; FOREVER is not a -time- value. The minimum on every product is 5 seconds: a shorter time, such as -time-2, is raised to 5 seconds.
# Residential IPv4 — valid (within 24h)
user-key-job7-session-88-time-30m:PASSWORD
# Residential IPv4 — shortened to 24h (over the 24h ceiling)
user-key-job7-session-88-time-48h:PASSWORD
# IPv6 — long holds are allowed
user-key-job7-session-88-time-7d:PASSWORDSuperPorts: sticky without per-request tags
If you authenticate by IP whitelist instead of user:pass, you cannot pass username tags, so use SuperPorts. SuperPorts bind a sticky duration (and geo) to specific port ranges at the plan level. Send traffic through a configured port range and every request inherits that sticky behavior automatically; this works under user:pass too, as the example below shows.
Example: bind ports 30000-31000 to a US exit with a 10-minute sticky window, then point your client at any port in that range:
curl -x "http://USERNAME:PASSWORD@gw-2312.coldproxy.com:30000" https://api.vipv6proxy.com/api/checker/my-ipUsername tags override SuperPort defaults. If a request through a sticky SuperPort still rotates, check that you have not also sent a username with conflicting (or incomplete) session/time tags on that request.
Confirm the IP is actually holding
Verify the fix empirically: send the same sticky username (or hit the same SuperPort) several times and confirm the exit IP is identical each time. Use the Proxy Checker for a quick read, or loop an IP-echo call from code.
import requests
sticky = "http://user-key-job7-session-88-time-10m:PASSWORD@gw-2312.coldproxy.com:30000"
proxies = {"http": sticky, "https": sticky}
ips = {requests.get("https://api.vipv6proxy.com/api/checker/my-ip", proxies=proxies, timeout=30).json()["ip"] for _ in range(5)}
print("unique exit IPs:", ips) # one IP while the session's exit IP worksIf the set still contains more than one IP, re-check that both the session and time tags are present and that the prefixes match your product configuration. For background on sticky versus rotating behavior, see IP rotation: rotating and sticky proxies explained and static vs rotating proxies.