The Problem: Rotation Breaks Stateful Workflows
Snowpad's rotation pool gives you a fresh IP on every request — that's the point. But some workflows need the same IP for a while:
- Logging into a site, then browsing pages (login binds to your IP)
- Checkout / payment flows that fingerprint your session
- Multi-step scrapes where the target tracks IP continuity
- Captcha challenge flows that re-verify the same IP
Buying a dedicated sticky plan just for a 10-minute checkout flow is overkill. That's why Snowpad now supports Sticky Sessions on every plan: pin your IP for up to 10 minutes by adding -session-<id> to your API key.
How It Works
# Rotation (default): fresh IP every request
socks5://<api_key>@gw.snowpad.io:9999
# Sticky session: same IP for the TTL window
socks5://<api_key>-session-<id>@gw.snowpad.io:9999The gateway reads the -session-<id> suffix from your username, binds all connections with that ID to one mobile node, and keeps you there until:
- The TTL expires (default 10 minutes) → the next connection with that ID re-pins to a fresh node, or
- The pinned node goes offline → your session silently remaps to a fresh online node, or
- You stop using the suffix → you're back to normal rotation.
You pick the session ID — any string works. Use abc123, a UUID, your order ID, whatever makes sense. The same session ID = the same IP.
Quick Start: cURL
# Same IP every time with session "abc123"
curl -x socks5h://YOUR_API_KEY-session-abc123@gw.snowpad.io:9999 http://httpbin.org/ip
curl -x socks5h://YOUR_API_KEY-session-abc123@gw.snowpad.io:9999 http://httpbin.org/ip
# Both requests print the same origin IP# Drop the suffix → fresh IP again
curl -x socks5h://YOUR_API_KEY@gw.snowpad.io:9999 http://httpbin.org/ipPython (requests + pysocks)
import requests
session_id = "order-4821"
proxy = f"socks5h://YOUR_API_KEY-session-{session_id}@gw.snowpad.io:9999"
proxies = {"http": proxy, "https": proxy}
# Every request with this session exits through the same IP
r1 = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=30)
r2 = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=30)
print(r1.json()["origin"]) # same IP
print(r2.json()["origin"]) # same IPPlaywright
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
headless=False,
proxy={
"server": "socks5://gw.snowpad.io:9999",
"username": "YOUR_API_KEY-session-checkout-77",
"password": "x",
},
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
browser.close()The whole browser session — login, cart, checkout — stays on one mobile IP.
What Happens at TTL Expiry
Sessions are time-boxed for a reason: mobile IPs are shared infrastructure, and pinning a phone forever is neither fair nor reliable. When your session's TTL expires:
- Your open connections keep working until they close naturally.
- Your next connection with the same session ID lands on a fresh node and re-pins — same session ID, new IP, zero config.
- If the pinned phone's battery dies or it loses signal, the gateway silently remaps you to another online node.
Rule of thumb: for long-running jobs, re-create the session ID periodically (or just keep using the same one — the gateway re-binds after expiry automatically).
Sticky Sessions vs Dedicated Sticky Plan
| Sticky Sessions (all plans) | Dedicated Sticky add-on | |
|---|---|---|
| Same IP for | Up to 10 minutes (TTL) | Forever (until node changes) |
| Plan needed | Any — Free, Pro, Dedicated | ₹2,400/mo per node add-on |
| Pool | Shared rotation pool | Your exclusive node |
| Use case | Logins, checkouts, short multi-step flows | Long-lived scraping, account management, IP reputation building |
Limits & Errors
- Sessions count toward your concurrent connection limit (60 on Pro, 9 on Free, 30 per dedicated node). Keep your worker count under it.
- Exceeding the limit returns SOCKS5 error
0x02("connection not allowed by ruleset") — reduce concurrency or let sessions expire. - If the pool is saturated you may see
0x02with "pool capacity exhausted" — retry with backoff.
FAQ
Do sessions work over HTTP CONNECT?
Yes. The -session-<id> suffix works on both SOCKS5 and HTTP CONNECT gateways. Use the same username format.
Can I have multiple sessions at once?
Yes. Each distinct session ID pins independently — session-A and session-B can be on different phones simultaneously. Sessions are capped per client to protect the network.
Is there any setup required?
No. The feature is live on all plans — no toggle, no config, no extra billing. Append the suffix and go.
Why would I ever drop the suffix?
When you want fresh IPs again — rotation is still the default, and it's the right choice for anonymous one-shot requests. Sessions are opt-in per connection.



