Sticky Session Best Practices
Sticky sessions maintain the same proxy IP across multiple requests. This is essential for workflows that rely on server-side state, such as login flows, shopping carts, or multi-page form submissions. Hex Proxies supports sticky sessions across its multi-carrier US ISP network and the 10M+ residential IP partner network.
How Sticky Sessions Work
Append a session identifier to your proxy username. The gateway maps that identifier to a specific exit IP and routes all matching requests through it:
Username format: YOUR_USERNAME-session-IDENTIFIER
Example: user123-session-checkout-flow-001When to Use Sticky Sessions
| Scenario | Session Type | Duration |
|---|---|---|
| Login + authenticated browsing | Sticky | 5-30 minutes |
| Shopping cart + checkout | Sticky | 10-15 minutes |
| Multi-page form submission | Sticky | 5-10 minutes |
| API with rate limits per IP | Sticky | Varies |
| Stateless scraping | Rotating | N/A |
| Price comparison | Rotating | N/A |
Implementation Patterns
Python: Session-Aware Scraping
import requests
import uuid
class StickyProxyScraper:
def __init__(self, base_user, password):
self.base_user = base_user
self.password = password
self.gateway = "gate.hexproxies.com:8080"
def create_session(self, label="default"):
session_id = f"{label}-{uuid.uuid4().hex[:8]}"
proxy_url = f"http://{self.base_user}-session-{session_id}:{self.password}@{self.gateway}"
session = requests.Session()
session.proxies = {"http": proxy_url, "https": proxy_url}
session.timeout = 30
return session
def login_and_scrape(self, login_url, target_url, credentials):
session = self.create_session("login")
# Login (same IP)
login_resp = session.post(login_url, json=credentials)
if login_resp.status_code != 200:
raise Exception(f"Login failed: {login_resp.status_code}")
# Scrape authenticated pages (same IP)
data_resp = session.get(target_url)
return data_resp.json()
scraper = StickyProxyScraper("YOUR_USERNAME", "YOUR_PASSWORD")
data = scraper.login_and_scrape(
"https://example.com/api/login",
"https://example.com/api/data",
{"user": "me", "pass": "secret"}
)Node.js: Session Management
import { HttpsProxyAgent } from 'https-proxy-agent';
import fetch from 'node-fetch';
import crypto from 'crypto';
function createStickyAgent(baseUser, password, label = 'default') {
const sessionId = `${label}-${crypto.randomBytes(4).toString('hex')}`;
const proxyUrl = `http://${baseUser}-session-${sessionId}:${password}@gate.hexproxies.com:8080`;
return new HttpsProxyAgent(proxyUrl);
}
const agent = createStickyAgent('YOUR_USERNAME', 'YOUR_PASSWORD', 'checkout');
// All requests through this agent use the same IP
const loginResp = await fetch('https://example.com/login', {
method: 'POST',
agent,
body: JSON.stringify({ user: 'me', pass: 'secret' }),
headers: { 'Content-Type': 'application/json' },
});
const dataResp = await fetch('https://example.com/dashboard', { agent });
console.log(await dataResp.json());Session Lifecycle Management
- Generate unique IDs: Use UUIDs or random hex strings. Never reuse session IDs across unrelated workflows.
- Label sessions: Include a human-readable label (e.g., "checkout", "login") for debugging.
- Expire sessions: Create new session IDs after the workflow completes. Do not hold sessions indefinitely.
- Handle IP changes: If the session IP changes unexpectedly, create a new session and restart the workflow.
Common Pitfalls
- Reusing session IDs across workflows: This can cause unrelated requests to share an IP, leading to unexpected blocks.
- Holding sessions too long: Extended sessions can trigger rate limits or IP reputation degradation.
- Mixing sticky and rotating in the same flow: The login request and subsequent authenticated requests must all use the same session ID.
- Not checking IP consistency: Verify the exit IP at the start and end of critical workflows.