Pool Gateway Access is a single credential that routes through our shared pool of real 4G/5G mobile proxies. Unlike a dedicated proxy (one modem, one port), one Pool Gateway credential reaches every country in your tier through one host - you pick the country per-request in the username, with no per-country repurchase.
Pay once with USDC via the x402 protocol on Base or Solana. No account registration. No API key. You get a metered, capped credential whose GB cap is exactly the USDC you paid. Top it up the same way.
| Feature | Details |
|---|---|
| One credential | Reaches all countries in the tier - switch country per-request, no new purchase |
| Gateway | gw.proxies.sx:7000 (HTTP) and :7001 (SOCKS5) |
| Tier (v1) | mbl - production ProxySmart modems, real mobile carriers |
| Countries | 6 production countries, live now: US, GB, PL, FR, NL, GE. Supply fluctuates - real-time list at /v1/gateway/pool/stock |
| Metering | Per-GB, capped at the USDC you paid - auto-suspends at the cap |
| Session control | Sticky / rotating per-request via the username DSL |
| Duration | Free - you only pay for traffic (GB) |
Dedicated proxy vs Pool Gateway: use a dedicated proxy when you want one pinned modem/port; use Pool Gateway when you want one key that reaches many countries and you select per-request.
Duration is free. You only pay for traffic. The GB cap equals the USDC you send.
| Tier | Traffic Price | Min Purchase | Quality |
|---|---|---|---|
mbl | $4.00/GB | 0.1 GB ($0.40) | Production modems - 6 countries, 10-15 Mbps, sub-1s TTFB |
Live tier catalog: GET /v1/x402/pool/pricing
| Method | URL | Description |
|---|---|---|
| GET | https://api.proxies.sx/v1/x402/pool/pricing | Tier catalog + networks (no payment) |
| GET/POST | https://api.proxies.sx/v1/x402/pool | Buy access (no payment -> 402 catalog; pay USDC -> credentials) |
| GET | https://api.proxies.sx/v1/x402/manage/pool/credit | Remaining GB (X-Session-Token) |
| POST | https://api.proxies.sx/v1/x402/manage/pool/topup | Add GB with more USDC |
| GET | https://api.proxies.sx/v1/x402/manage/pool/usage | Per-day usage |
| POST | https://api.proxies.sx/v1/x402/manage/pool/regenerate | Rotate the secret, keep the username |
| GET | https://api.proxies.sx/v1/x402/manage/pool/connection | Re-emit credentials (recovery) |
curl "https://api.proxies.sx/v1/x402/pool?tier=mbl&country=us&traffic=1"
With no payment header it returns HTTP 402 with the tier catalog and the wallets to pay:
{
"x402Version": 1,
"error": "Payment required",
"accepts": [
{ "scheme": "exact", "network": "base",
"maxAmountRequired": "4000000",
"payTo": "0xF8cD900794245fc36CBE65be9afc23CDF5103042",
"asset": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913" },
{ "scheme": "exact", "network": "solana",
"maxAmountRequired": "4000000",
"payTo": "6eUdVwsPArTxwVqEARYGCh4S2qwW2zCs7jSEDRpxydnv",
"asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" }
]
}
Send the USDC ($4 = 1 GB) to the recipient wallet on Base (~2s) or Solana (~400ms).
curl "https://api.proxies.sx/v1/x402/pool?tier=mbl&country=us&traffic=1" \
-H "Payment-Signature: <your_transaction_hash>"
You receive one gateway credential (username token + secret) plus a session token to manage it:
{
"host": "gw.proxies.sx",
"httpPort": 7000,
"socksPort": 7001,
"username": "psx_<account>-mbl-us",
"password": "pak_xxxxxxxxxxxxxxxxxxxxxxxx",
"tier": "mbl",
"trafficCapGB": 1,
"sessionToken": "x402s_..."
}
One credential reaches every country in the tier. You pick the country and behaviour per connection by composing the username from --delimited tokens. The gateway lowercases the whole username and splits on -, so no token value may contain a hyphen. The pak_ secret is the password.
psx_<account>-mbl-<country>[-sid-<id>][-rot-<mode>][-failover-<policy>][-carrier-<slug>] : pak_<secret>
└──────────────────────────── username ────────────────────────────┘ (password)
required: psx_<account> . mbl . country (2-letter ISO)
optional: everything in [ ] - order-independent, each has a safe default
| Token | Value | Default | Notes |
|---|---|---|---|
pool | mbl | required | v1 production tier (real carrier modems) |
country | 2-letter ISO | required | same key, switch per request. Live list: stock endpoint below |
sid | 8-64 [a-z0-9_] | none | REQUIRED for a sticky/auto session to persist across connections. See sid rules |
rot | see modes below | auto10 | rotation behaviour |
failover | samecountry \| samecarrier \| any \| strict | samecountry | if the exit dies mid-request, where to retry |
carrier | brand slug (mbl) | none | soft carrier match, e.g. -carrier-tmobile. Never use -asn- on mbl (that is a peer-pool token; it filters mobile stock to zero) |
city | slug | none | soft city match, e.g. -city-newyork |
The sid is the "port name" that makes a session persist. Use 8-64 chars of [a-z0-9_], no hyphens. At purchase time a sid that sanitizes to fewer than 8 chars is silently replaced with a random one - so your intended stickiness is lost. Keep to 8-64 and it works on both the buy and the gateway paths:
| Rule | Good | Bad - why |
|---|---|---|
| 8-64 chars, lowercase a-z / 0-9 / underscore | cust_8f3a21bd | t1 - under 8 chars, auto-replaced |
| no uppercase, no hyphens (a hyphen splits the token) | order_99213 | job-42 - two tokens; Job_4201 - uppercase |
| never empty | worker_0001 | empty - no session, fresh IP each call |
| STABLE per workflow/customer | reuse the same sid for the same job | a new random sid per call = a new IP per call |
Derive a sid from any string: lowercase it, delete every char that is not [a-z0-9_], make sure it is 8-64 chars (pad a short one), then reuse it for every request that should share an exit IP. "Order #99/A" -> order_0099a. Note: -session- is NOT a token - only -sid- creates a session.
| Mode | Behaviour |
|---|---|
auto10 (default) | re-pick a fresh modem every 10 min (also auto5 / auto20 / auto60). Omit the -rot- token to get this |
sticky | pin the same modem for the session - needs a -sid- |
sticky-strict | strongest IP hold - pins the most IP-stable modem. Best for login / cookie / 2FA flows. Needs a -sid- |
ondemand | new IP only when you open a new connection |
Sticky pins the MODEM, not the IP - mobile carrier CGNAT can still re-NAT the exit IP across calls. For the strongest hold pair sticky-strict with a stable -sid-.
The mbl tier currently serves US, GB, PL, FR, NL, GE, but supply moves. Read the live stock endpoint (online counts per country, no IPs) before targeting a country:
curl https://api.proxies.sx/v1/gateway/pool/stock
# { "pools": { "mbl": { "us": 40, "nl": 26, "pl": 21, "gb": 18, "fr": 17, "ge": 3 } } }
# 1) US, sticky for one customer - same exit IP across the whole workflow
http://psx_abc123-mbl-us-sid-cust_8f3a21bd-rot-sticky:pak_xxxx@gw.proxies.sx:7000
# 2) UK, default rotation (fresh IP ~every 10 min) - no extra tokens
http://psx_abc123-mbl-gb:pak_xxxx@gw.proxies.sx:7000
# 3) Netherlands, strongest IP hold for a login/cookie flow
http://psx_abc123-mbl-nl-sid-login_7782-rot-sticky-strict:pak_xxxx@gw.proxies.sx:7000
# 4) US on T-Mobile specifically (soft carrier match - mbl uses -carrier-, not -asn-)
http://psx_abc123-mbl-us-sid-job_us01-rot-sticky-carrier-tmobile:pak_xxxx@gw.proxies.sx:7000
# 5) Same username on SOCKS5 - just use port 7001
socks5://psx_abc123-mbl-fr-sid-task_9001-rot-sticky:pak_xxxx@gw.proxies.sx:7001
// JavaScript
function poolUsername(account, country, { sid, rot } = {}) {
const slug = s => String(s || '').toLowerCase().replace(/[^a-z0-9_]/g, '').slice(0, 64);
let u = `psx_${account}-mbl-${country.toLowerCase()}`;
if (sid) u += `-sid-${slug(sid)}`; // stable id, no hyphens
if (rot && rot !== 'auto10') u += `-rot-${rot}`; // omit for the default
return u;
}
const user = poolUsername('abc123', 'us', { sid: 'cust_8f3a21bd', rot: 'sticky' });
const proxy = `http://${user}:${pak}@gw.proxies.sx:7000`;
# Python
import re
def pool_username(account, country, sid=None, rot=None):
slug = lambda s: re.sub(r'[^a-z0-9_]', '', (s or '').lower())[:64]
u = f"psx_{account}-mbl-{country.lower()}"
if sid: u += f"-sid-{slug(sid)}"
if rot and rot != "auto10": u += f"-rot-{rot}"
return u
user = pool_username('abc123', 'us', sid='cust_8f3a21bd', rot='sticky')
proxy = f"http://{user}:{pak}@gw.proxies.sx:7000"
| Format | Example |
|---|---|
| URL | http://USER:pak@gw.proxies.sx:7000 |
| host:port:user:pass | gw.proxies.sx:7000:USER:pak |
| user:pass@host:port | USER:pak@gw.proxies.sx:7000 |
curl -x "http://psx_abc123-mbl-us-sid-cust_8f3a21bd-rot-sticky:pak_xxxx@gw.proxies.sx:7000" https://api.ipify.org
After purchase, manage the credential with the session token:
# Remaining GB
curl "https://api.proxies.sx/v1/x402/manage/pool/credit" \
-H "X-Session-Token: x402s_..."
# Top up with more USDC (returns a 402, pay, retry with Payment-Signature)
curl -X POST "https://api.proxies.sx/v1/x402/manage/pool/topup?addTrafficGB=2" \
-H "X-Session-Token: x402s_..."
A wallet-only agent can buy Pool Gateway access end-to-end with no human and no account:
/v1/x402/pool -> 402 catalog with pricing + walletsPayment-Signature header -> receive the credential| Resource | URL |
|---|---|
| Skill file (this product) | agents.proxies.sx/pool/skill.md |
| Quickstart (30 seconds) | agents.proxies.sx/pool-quickstart.html |
| Master skill file | agents.proxies.sx/skill.md |
| x402 discovery | /.well-known/x402.json |
| LLMs.txt | agents.proxies.sx/llms.txt |
| MCP Server | @proxies-sx/mcp-server |
| x402 Protocol | x402.org |
Resellers can mint their own per-customer pak_ keys for the same gateway - see Build & Resell.
| Network | Settlement | Recipient Wallet | USDC Contract |
|---|---|---|---|
| Base | ~2 seconds | 0xF8cD900794245fc36CBE65be9afc23CDF5103042 | 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 |
| Solana | ~400ms | 6eUdVwsPArTxwVqEARYGCh4S2qwW2zCs7jSEDRpxydnv | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |