This is Pool Gateway Access. If you instead need ONE dedicated modem with a fixed host:port, see the Dedicated Port at /marketplace/proxy/. Two different products: DEDICATED PORT = one real port on one modem, its own host:port, one country fixed at purchase - the modem is exclusively yours and rotates only when YOU hit the rotate URL (carrier NAT can still re-issue the exit IP). POOL GATEWAY = one credential on gw.proxies.sx:7000, every country in the tier - country, session and rotation are declared per-request in the proxy username. Full comparison below.
First request - no auth, no payment. It returns HTTP 402 with the full buyable catalog and the wallets to pay:
curl "https://api.proxies.sx/v1/x402/pool?tier=mbl&country=us&traffic=1"
Then: pay USDC to one of the listed wallets, retry the same request with Payment-Signature: <tx_hash>, and persist the returned password (pak_), sessionToken (x402s_), and your tx hash. Full steps below.
Canonical machine contract: /pool/skill.md. If this page disagrees with the skill file, the skill file wins; if the skill file disagrees with the live API, the live API wins.
Pool Gateway Access is a single credential that routes through a shared pool of real 4G/5G mobile proxies. A Dedicated Port gives you one modem on one port; one Pool Gateway credential reaches every country in your tier through one host. You select the country per request in the proxy username - no per-country repurchase.
Payment is USDC via the x402 protocol on Base or Solana. No account registration. No API key. The credential is metered and capped: its 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; SOCKS5 on :7001 works for reseller-minted pak_ keys and regular account credentials, but rejects this x402-purchased credential in v1) |
| Tier (v1) | mbl - production ProxySmart modems, real mobile carriers |
| Countries | 6 production countries: US, GB, PL, FR, NL, GE (Georgia). Supply fluctuates - read the live list from /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 PORT = one real port on one modem, its own host:port, one country fixed at purchase - the modem is exclusively yours and rotates only when YOU hit the rotate URL (carrier NAT can still re-issue the exit IP). POOL GATEWAY = one credential on gw.proxies.sx:7000, every country in the tier - country, session and rotation are declared per-request in the proxy username.
| Dedicated Port (/v1/x402/proxy) | Pool Gateway (/v1/x402/pool) | |
|---|---|---|
| What payment mints | A real port on ONE modem (ProxySmart), bound to that device | A metered pak_ credential; no device touched - modem picked live per connection |
| Endpoint | Unique serverIp:port per purchase | Shared gw.proxies.sx:7000 for everyone; routing lives in the username |
| Country | Fixed at purchase. Change = recreate the port (only with 0 active ports left) | Edit the country slot in the username per request - same credential, no repurchase |
| Rotation | True carrier-IP reset via public /v1/rotate/<token> URL (5-min cooldown, auto 5-1440 min) | -rot- token only: auto5/10/20/60 re-pick a modem on interval; sticky/hard pin the modem. No rotate URL; no mode gives per-request IP change |
| SOCKS5 | Yes - working socks5:// URL included | No - HTTP :7000 only in v1; :7001 rejects this credential |
| Concurrency | One modem. Fan-out = buy more ports | Parallel sessions on different modems via distinct -sid- values; capped at 250 sessions / 500 connections per account |
| Payment rails | Solana, Base, AND facilitator signed intents (EIP-3009) | Solana and Base on-chain only - facilitator rail rejected |
| Failure recovery | /manage/ports/replace (free, max 3, new device) or /ports/recreate | Automatic - dead modems routed around on next pick; /manage/pool/regenerate rotates the secret |
IP caveats (both): mobile carriers re-NAT egress IPs on their own cadence - a dedicated port holds a MODEM you control the rotation of, not a fixed IP; pool -rot-sticky pins the MODEM for the session, never the IP. Pool sessions need a -sid-<id> token to stick across connections (-session- is silently ignored).
> Cookie-bound / login / 2FA work in one country: one held modem whose IP changes only when you trigger it - no pool selector re-picks under you.
> You need SOCKS5 - the pool credential is HTTP-only in v1.
> You need on-demand true carrier-IP resets via the public rotate URL - the pool cannot do this at all.
> You must hard-pin a city or carrier at purchase, or you pay via facilitator signed intents (EIP-3009) - only this product accepts either.
> Multi-country work from one purchase: same key, edit us → gb → pl → fr in the username per request.
> High fan-out: hundreds of parallel sticky sessions (distinct -sid- values land on different modems) through one credential.
> A fleet of agents shares one secret, one top-up, one credit meter - instead of N ports with N passwords.
> You want zero babysitting: default auto10 rotates modems every 10 min with no API calls, and dead modems are routed around automatically.
Same for both: $4.00/GB, 0.1 GB ($0.40) minimum, duration free - you only pay for traffic. Accountless x402 flow (HTTP 402 → pay USDC on Base ~2s or Solana ~400ms → retry with Payment-Signature), same replay protection, same x402s_ session token for management, and the same real ProxySmart 4G/5G carrier modems in the same ~6 countries (US, GB, PL, FR, NL, GE). The difference is topology, not hardware or price.
Duration is free. You only pay for traffic. The GB cap equals the USDC you send.
Real mobile IPs, not datacenter relabelled as "residential" - the cheap kind that gets flagged the moment you hit a protected site. Verify any exit IP on ipinfo.io / MaxMind / IP2Location before you pay.
| 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 (X-Session-Token + Payment-Signature) |
| GET | https://api.proxies.sx/v1/x402/manage/pool/usage | Per-day usage (X-Session-Token) |
| POST | https://api.proxies.sx/v1/x402/manage/pool/regenerate | Rotate the secret, keep the username (X-Session-Token) |
| GET | https://api.proxies.sx/v1/x402/manage/pool/connection | Re-emit credentials, recovery (X-Session-Token) |
/v1/x402/pool)| Param | Required | Default | Valid values |
|---|---|---|---|
tier | no | mbl | mbl (6-country carrier modems) or peer (flagship, ~82 countries) - both $4/GB |
country | no | any | 2-letter ISO code (e.g. us, gb) or any |
traffic | yes, on the paid request | - | GB, 0.1 to 1000 for mbl. Any request without a payment header returns the 402 catalog regardless |
duration | no | 2592000 (30 days) | seconds, max 7776000 (90 days). Duration never changes the price |
sid | no | auto-generated | 8-64 chars [a-z0-9_]; anything that sanitizes shorter is replaced with a random sid (see sid rules below) |
rot | no | sticky | sticky, hard, auto5, auto10, auto20, auto60, ondemand |
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" }
]
}
maxAmountRequired is micro-USDC (6 decimals): 4000000 = $4.00 = 1 GB. The live 402 also carries an accepts[].outputSchema - ignore it: it is inherited from the dedicated-port product and is wrong for pool purchases (the real parameters are in the table above).
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:
{
"product": "pool",
"proxy": {
"host": "gw.proxies.sx",
"httpPort": 7000,
"username": "psx_<account>-mbl-us-sid-<id>-rot-sticky",
"password": "pak_xxxxxxxxxxxxxxxxxxxxxxxx",
"http": "http://psx_<account>-mbl-us-sid-<id>-rot-sticky:pak_...@gw.proxies.sx:7000",
"socks5": null
},
"credit": {
"allocatedGB": 1,
"usedGB": 0,
"remainingGB": 1,
"expiresAt": "2026-08-01T00:00:00.000Z"
},
"sessionToken": "x402s_...",
"manage": { "credit": "...", "topup": "...", "usage": "...", "regenerate": "...", "connection": "..." }
}
Persist three fields: (1) proxy.password - the pak_ secret, your gateway password; (2) sessionToken (top-level) - the x402s_ token, the ONLY way to manage or recover the credential; (3) your payment tx hash - proof of purchase. The returned proxy.username already carries your -sid- and -rot- tokens (the values you passed at buy time, or generated defaults). Use it as returned; edit only the country slot per request.
HTTP :7000 only in v1 - this x402-purchased credential is rejected on :7001 (SOCKS5). SOCKS5 is available for reseller-minted pak_ keys and regular account credentials, not the house/x402 credential.
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 \| samenode \| any \| strict | samecountry | if the exit dies mid-request, where to retry (samenode = same relay server) |
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 |
Default nuance: a username with no -rot- token gets auto10 at the gateway; the username returned by the purchase carries -rot-sticky unless you passed a different rot= at buy time.
The sid is the "port name" that makes a session persist. Use 8-64 chars of [a-z0-9_], no hyphens. The gateway parser is self-healing (it accepts whatever survives sanitization), but at purchase time a sid that sanitizes to fewer than 8 chars is silently replaced with a random one - your intended stickiness is lost. Keep to 8-64 and both the buy path and the gateway path agree:
| 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- |
hard | pins like sticky (same modem). It does NOT mean a new IP per request |
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-strict is the one sanctioned compound: the gateway parses it as rot=sticky plus a strict flag (the DSL splits on -), so its internal hyphen is safe - it does not break the no-hyphen rule for token values.
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 serves US, GB, PL, FR, NL, GE (Georgia), 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 - no sid, so each new connection may land on a different modem
# (add -sid- for a stable auto10 session that re-picks the modem every ~10 min)
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
# Note: SOCKS5 (:7001) is NOT available for x402-purchased pool credentials in v1.
# Use HTTP :7000 only. SOCKS5 works for reseller paks and account credentials - see pool-quickstart.html.
// 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 |
Success prints the exit IP of a US mobile modem. A 407 means bad credentials or an exhausted/disabled cap - check /v1/x402/manage/pool/credit.
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 (X-Session-Token header):
# Remaining GB
curl "https://api.proxies.sx/v1/x402/manage/pool/credit" \
-H "X-Session-Token: x402s_..."
Response - metering is live and read-through (remainingGB = allocatedGB - usedGB):
{
"tier": "mbl",
"allocatedGB": 1,
"usedGB": 0.2143,
"remainingGB": 0.7857,
"enabled": true,
"expiresAt": "2026-07-12T00:00:00.000Z",
"sessionToken": "x402s_..."
}
When usedGB reaches the cap, enabled flips to false automatically and the gateway rejects auth with 407. Top up to re-enable:
# Top up with more USDC (returns a 402, pay it, retry with Payment-Signature)
curl -X POST "https://api.proxies.sx/v1/x402/manage/pool/topup?addTrafficGB=2" \
-H "X-Session-Token: x402s_..."
Lost the password but kept the session token? GET /v1/x402/manage/pool/connection re-emits the full credentials. POST /v1/x402/manage/pool/regenerate rotates the pak_ secret and keeps the username.
A wallet-only agent buys 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; persist password, sessionToken, and the tx hash| Resource | URL |
|---|---|
| Skill file (this product) | agents.proxies.sx/pool/skill.md |
| Rotation cookbook (copy-paste + footguns) | agents.proxies.sx/pool/rotation-cookbook.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 |
Support: maya@proxies.sx or https://t.me/proxies_sx - quote the req id from any gateway error body.
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 |