earningsPerGB.Before registering: share bandwidth only from devices whose owners have given informed consent. Sign the current partner agreement in your own legal name and use your own account-linked API key for listed traffic. Registration alone does not guarantee listing or earnings. Start with a small consented pilot and pass the self-test before expanding your fleet.
Required source declaration: complete Farmer Settings → Peer source with device owners and suppliers, app/distribution channels, actual network mix, informed permission and withdrawal. Submission is not independent identity or consent verification. A secure identity/business verification process is being prepared; do not send ID documents by email or tickets.
Supplier key: open Spawn API key, select SDK / device, enter a name and choose Create API key. This preset grants account:read. Save the one-time secret privately, then continue to SDK setup. Review existing keys at API keys; keep any key used by a working device active. A key alone does not establish eligibility or earnings.
First action after these prerequisites - register. The response contains your deviceId, JWT, relay URL, and live per-GB rates:
curl -s -X POST 'https://api.proxies.sx/v1/peer/agents/register' \
-H "Content-Type: application/json" \
-d '{"name":"my-agent","type":"claude","walletAddress":"YOUR_SOLANA_ADDRESS","apiKey":"psx_YOUR_API_KEY"}'
Then: 1) connect to the returned relay URL over WebSocket, 2) send a heartbeat every 30s and serve tunnel_connect tunnels, 3) refresh the JWT every ~50 min, 4) withdraw once pending earnings reach the minimum. Full sequence: Quick Start. Machine-readable contract: /peer/skill.md. Here to BUY and rotate proxies instead of earn? See the rotation cookbook.
The Proxies.sx Peer Network pays for bandwidth. Proxy customers route traffic through your device's connection; every routed GB accrues to your balance at the rate for your IP type. Payouts are USDC on Solana.
| Method | Setup | Best For | Earnings Potential |
|---|---|---|---|
| AI Agent | 2 API calls + WebSocket | Bots, scripts, automation | Depends on uptime and IP type |
| Android SDK | Gradle dependency + 3 lines of code | Mobile apps, background sharing | Mobile IPs = highest rate tier |
| VPS / Docker | One docker-compose command | Server operators, crypto miners | Always-on steady earnings |
All methods speak the same relay protocol and earn at the same per-IP-type rates. Connect to the relay URL returned by registration (wss://relay.proxies.sx or a nearer regional relay - the register response's relay field is authoritative).
| IP Type | Tier | Detection | Examples |
|---|---|---|---|
| Mobile | Highest | Server-side ASN lookup | AT&T, Verizon, T-Mobile, Vodafone, O2 |
| Residential | Mid | Server-side ASN lookup | Comcast, Spectrum, Cox, BT, Deutsche Telekom |
| Datacenter | Base | Server-side ASN lookup | AWS, GCP, Azure, Hetzner, OVH, DigitalOcean |
Your payout is a revenue share of the revenue actually collected on the traffic your device serves, set by Proxies.sx and customized per partner - there is no fixed public percentage; rates are configured by our team, can be tailored to you, and move with demand, paid NET with no platform fee taken on top. Get the current value by calling POST /v1/peer/agents/register and reading the earningsPerGB field, which shows live values for each tier at registration time. The same revenue-share model applies identically to AI agents, Android SDK devices, and modem farmers - a real mobile carrier IP earns the mobile tier regardless of how it joined the network. IP type is determined server-side via ASN lookup; device-reported type is ignored (cannot spoof).
Your payout is a revenue share of the revenue actually collected on the traffic your device serves - paid NET, with no platform fee taken on top. There is no fixed public percentage: it's set by Proxies.sx, customized per partner, and moves with demand and IP type - so read the live value in earningsPerGB at registration rather than assuming a fixed number.
| IP Type | Relative earning potential |
|---|---|
| Mobile 5G | Highest demand - carrier IPs attract the most agent/scraper demand |
| Residential | Mid |
| Datacenter VPS | Low (base tier) |
There is no fixed monthly figure: your total = your revenue share x the GB actually routed through your device, which depends on demand, location, uptime, and carrier ASN reputation. Live per-GB rate at any moment: POST /v1/peer/agents/register -> the earningsPerGB field.
| Platform | Pricing Model | Min Payout | Payment |
|---|---|---|---|
| Proxies.sx | Revenue share, custom per partner, tiered by IP type (live rate returned at registration) | $5 / $10 | USDC on Solana |
| Honeygain | ~$0.01/GB flat | $20 | PayPal / BTC |
| PacketStream | ~$0.10/GB flat | $5 | PayPal |
| Pawns.app | ~$0.02/GB flat | $5 | PayPal / BTC |
Rates and eligible earnings follow your active partner terms and actual served traffic. Confirm payout timing for your account; there is no guaranteed traffic or universal payment schedule. Live configured rate: POST /v1/peer/agents/register → check earningsPerGB in the response.
Open Payouts to see outstanding earnings, amounts available to request and completed payment receipts. Payment history is retained, and earnings accrued after a payment remain outstanding. Cash payments and earned allocations can differ; use the displayed outstanding balance rather than subtracting cash receipts from lifetime earnings.
Payout settings support separate wallets for native SOL on Solana, native BTC on Bitcoin mainnet, and USDC on Solana. Check the currency and network. A saved wallet or payout request does not send money automatically. Completed native receipts show the recorded asset amount, USD reference and transaction link when available.
Manual farmer-account requests can include approved, unclaimed earnings of at least $0.01, including amounts below the saved payout preference. Unapproved earnings remain visible as outstanding. The separate agent/device withdrawal API minimums below are unchanged. Account payment details for integrators.
| Detail | Value |
|---|---|
| Minimum payout - AI agents (custom integrations) | $5.00 USDC |
| Minimum payout - Android SDK devices | $10.00 USDC |
| Payment currency | USDC |
| Payment network | Solana |
| Processing time | 24-48 hours after admin approval |
| Wallet cooling period | 7 days after a change (security) |
| Withdraw endpoint | POST /v1/peer/agents/:deviceId/withdraw |
1. Register POST /v1/peer/agents/register - get deviceId + JWT (1h) + refreshToken
Pass apiKey="psx_..." so earnings auto-link to your account
2. Connect to the relay URL from the register response (register.relay, geo-assigned)
with Sec-WebSocket-Protocol: token.{JWT}
3. Heartbeat Send {"type":"heartbeat"} every 30s - the relay replies heartbeat_ack
(peers silent for 120s are force-closed by the zombie sweep)
4. Refresh POST /v1/peer/agents/{id}/refresh - every ~50 min before JWT expires
5. Tunnel Receive tunnel_connect -> open TCP to the target -> stream bytes both ways
(the ready SDKs below do this for you; see the diagnostic note)
6. Earn a revenue share of collected revenue - rate set by Proxies.sx,
customized per partner, moves with demand - live per-GB rate in
earningsPerGB field of the register response. Withdraw at
$5+ (agents) / $10+ (SDK devices).
+-----------------+ +------------------+ +------------------+
| Your Device |---->| Relay Server |<----| Proxy Gateway |
| (Peer Node) | | (WebSocket Hub) | | (HTTP Proxy) |
+-----------------+ +------------------+ +------------------+
| | |
| Share bandwidth | Match peers to | Accept customer
v | proxy requests | connections
+-----------------+ +------------------+ +------------------+
| Earn by IP type:| | wss://relay | | gw.proxies.sx |
| Earn per GB | | .proxies.sx | | port 7000 |
| Auto-accumulate | | | | |
| USDC payouts | | | | |
+-----------------+ +------------------+ +------------------+
Relay Server - WebSocket hub that manages peer connections and routes proxy traffic between customers and peers.
Gateway - HTTP proxy server that accepts customer connections (host:port with credentials) and forwards traffic through matched peers via the relay.
Backend API - Handles registration, authentication, earnings tracking, payouts, and IP classification.
| Stack | Download | Run |
|---|---|---|
| Node.js | reference-sdk.js | API_KEY=psx_... node reference-sdk.js |
| Linux x86-64, no UI | Standalone 1.6.8 package · installation guide · 中文 | No Go/compiler needed; checksum + systemd installer included |
| Go source | reference-sdk.go + go.mod | go run reference-sdk.go -key=psx_... |
| Windows Node.js | Windows Node.js package 1.6.5 | Install Node.js, then run setup.bat and start.bat. Checksums · Keep existing identity when updating. The separate native executable is unchanged. |
| Android (developers) | android-peer-sdk | Library for your Android app; no standalone APK download (see Android SDK section) |
Sec-WebSocket-Protocol header as token.<jwt> (never the URL), and the relay now uses streaming tunnel_connect tunnels - the older proxy_request shown in some snippets is legacy. The ready SDKs above do both correctly.
| Guide | Best for | Covers |
|---|---|---|
| Go SDK → | Headless Linux package, static binary, optional source build | protected-key systemd install, persistent identity, staged acceptance |
| Windows SDK → | Windows PCs, non-technical operators | double-click setup, NSSM/Task Scheduler service, .exe build, mass deploy |
| Android SDK ↓ | Mobile apps, background sharing (highest IP tier) | Gradle, JitPack, init in 3 lines (section below) |
| Node.js / Docker | Any machine with Node 18+, containers | one file, Docker one-liner (this section) |
curl -s -X POST 'https://api.proxies.sx/v1/peer/agents/register' \
-H "Content-Type: application/json" \
-d '{
"name": "my-agent",
"type": "claude",
"walletAddress": "YOUR_SOLANA_ADDRESS",
"apiKey": "psx_YOUR_API_KEY"
}'
# Response:
# {
# "deviceId": "agent_abc123",
# "jwt": "eyJ...", // 1-hour JWT
# "refreshToken": "a1b2...", // store this, used to refresh JWT
# "relay": "wss://relay.proxies.sx",
# "earningsPerGB": { "mobile": <CURRENT_RATE>, "residential": <CURRENT_RATE>, "datacenter": <CURRENT_RATE> }
# (rates set by platform, can change anytime - read this field to know your live rate)
# }
Your own account-linked apiKey is required for listed traffic. Anonymous registration
does not qualify the device for customer traffic. Get an API key at
client.proxies.sx/api-keys -> New. SDK devices auto-link to
the farmer/peer account that owns the API key.
JWT lifespan: 1 hour. To avoid disconnect, save the refreshToken and call
POST /v1/peer/agents/{deviceId}/refresh with body {"refreshToken":"..."}
before the JWT expires (rate limit: 10 refreshes per minute). The relay closes the WebSocket with
code 4002 if the JWT is invalid/expired (4001 = you sent no token at all) -
on a 4001/4002 close, refresh the JWT once for all sockets and reconnect.
Current protocol: streaming TCP tunnels (tunnel_connect / tunnel_data / tunnel_close). The JWT goes in the Sec-WebSocket-Protocol header as token.<jwt>, never in the URL. Connect to the relay URL from your register response, not a hardcoded host.
const net = require('net');
const tunnels = new Map(); // sessionId -> TCP socket
const ws = new WebSocket(register.relay, [`token.${JWT}`]); // JWT in Sec-WebSocket-Protocol
ws.on('open', () => {
// REQUIRED: send a heartbeat every 30s; the relay replies heartbeat_ack.
// The relay never pings you - peers silent for 120s are force-closed.
const heartbeatTimer = setInterval(() => ws.send(JSON.stringify({ type: 'heartbeat', payload: {} })), 30000);
ws.once('close', () => clearInterval(heartbeatTimer));
ws.send(JSON.stringify({
type: 'device_info',
payload: {
country: 'US',
protocol: 'binary-v1', // opt into binary tunnel frames (faster; see /peer/skill.md)
supportsRelayRedirect: true // honor server-driven nearest-relay routing
}
}));
});
ws.on('message', (raw, isBinary) => {
if (isBinary) return handleBinaryFrame(raw); // binary-v1 tunnel_data/tunnel_close - framing in /peer/skill.md
const msg = JSON.parse(raw.toString());
if (msg.type === 'tunnel_connect') {
const { sessionId, host, port } = msg.payload;
const sock = net.connect(port, host); // open TCP to the target
tunnels.set(sessionId, sock);
sock.on('connect', () => ws.send(JSON.stringify({ type: 'tunnel_connected', payload: { sessionId } })));
sock.on('data', (d) => ws.send(JSON.stringify({ type: 'tunnel_data', payload: { sessionId, data: d.toString('base64') } })));
sock.on('close', () => { tunnels.delete(sessionId); ws.send(JSON.stringify({ type: 'tunnel_closed', payload: { sessionId } })); });
}
if (msg.type === 'tunnel_data') { const s = tunnels.get(msg.payload.sessionId); if (s) s.write(Buffer.from(msg.payload.data, 'base64')); }
if (msg.type === 'tunnel_close') { const s = tunnels.get(msg.payload.sessionId); if (s) s.destroy(); }
if (msg.type === 'heartbeat_ack') { /* relay ack of your heartbeat - no action needed */ }
});
Sharp edge: after tunnel_connect, the first bytes must flow back within 5 seconds or the relay force-closes the tunnel (tunnel_open_timeout); repeated failures delist the device. The older proxy_request/proxy_response flow is legacy - do not build new clients on it. Full message reference: /peer/skill.md.
curl -s -X POST "https://api.proxies.sx/v1/peer/agents/${DEVICE_ID}/refresh" \
-H "Content-Type: application/json" \
-d "{\"refreshToken\":\"${REFRESH_TOKEN}\"}"
# Response: { "jwt": "eyJ...new...", "expiresIn": "1h" }
#
# Run this every ~50 minutes to keep your WebSocket alive without re-registering.
# If the relay closes with code 4002 (invalid/expired JWT; 4001 = no token sent),
# refresh ONCE for all sockets and reconnect with the new JWT.
# Code 1013 = transient backend issue: retry with the SAME token, do not re-register.
# Rate limit: 10 refreshes / minute.
curl -s "https://api.proxies.sx/v1/peer/agents/${DEVICE_ID}/earnings" \
-H "Authorization: Bearer $JWT" | jq
# Response shows:
# pendingPayoutCents - earned but not yet paid (you'll see this grow per GB)
# totalEarnedCents - lifetime earnings
# minimumPayoutCents - 500 ($5) for agents, 1000 ($10) for SDK devices
# canRequestPayout - true once pending >= minimum
# ipType - your detected IP class (sets your rate tier)
# earningsPerGB - live per-GB rates by tier (the authoritative rate)
curl -s -X POST "https://api.proxies.sx/v1/peer/agents/${DEVICE_ID}/withdraw" \
-H "Authorization: Bearer $JWT" \
-H "Content-Type: application/json" \
-d '{"walletAddress":"YOUR_SOLANA_ADDRESS"}'
# Note: walletAddress is REQUIRED by validation (a valid 32-44 char base58
# Solana address; an empty body {} is rejected with 400) - but the payout
# wallet is ALWAYS the one you registered with (or set via
# /v1/peer/agents/:id/wallet). The body value is intentionally ignored if a
# wallet is already registered, to prevent siphoning.
# Wallet changes have a 7-day cooling period before withdrawals work again.
#
# Min payout: $5 for agents, $10 for SDK devices.
# Admin processes USDC payouts within 24-48 hours.
# Runs the official tested SDK (reference-sdk.js). Just pass your API key.
# - The -v volume PERSISTS the device identity, so a restart REUSES the same
# device (token refresh) instead of registering a new one (no orphan devices,
# no register 429s).
# - No AGENT_NAME is set on purpose: the SDK defaults to the container's unique
# hostname, so each container is its own stable device (setting the SAME name
# on many containers would collapse them into ONE device - do not do that).
# - The deps/download are guarded, so a restart is instant and never resets
# docker's restart backoff.
docker run -d --name proxies-peer \
-e API_KEY=psx_your_key \
-e PEER_STATE_FILE=/state/id.json \
-v proxies-peer-state:/state \
--restart unless-stopped \
node:20-alpine sh -c "[ -e node_modules/ws ] || npm i ws; [ -f reference-sdk.js ] || wget -qO reference-sdk.js https://agents.proxies.sx/peer/reference-sdk.js?v=1.6.5; node reference-sdk.js"
The Docker command downloads the source only when it is absent. Restarting an existing container does not update a cached SDK. Replace the source in a controlled same-identity update; preserve the key, fixed name and state.
HTTP 429 while connecting a socket? Relay admission may be congested even after registration succeeds. Go 1.6.8 and Node/Windows Node 1.6.5 keep authenticated relay assignments in the fallback cycle and atomically save accepted redirects for SDK restarts, while retaining healthy-connection protection, Retry-After and jittered retries. Preserve your existing key, name and saved identity. For the Windows Node package, follow the same-folder update instructions. New Node/Windows configurations default to one socket; explicit connection settings remain. One socket reduces attempts but does not guarantee admission. CONNECTED/ACK is separate from routing verification and listing.
Getting 429 on register? A source-IP burst or shared registration capacity can cause this, even at a low rate from your own fleet. Honor Retry-After, back off with jitter, and persist identity so restarts refresh tokens instead of registering again. The Node SDK v1.6.0 and Go SDK v1.6.1+ provide registration backoff and REGISTER_JITTER_MS; Go v1.6.0 did not implement these registration controls. Use the updated Go package and guide. If the limit persists, send support one device name and the exact UTC time, never your API key. We can review a bounded onboarding window. For a real fleet: one container per outbound IP (500 containers behind one VPS IP are one datacenter exit, not 500 residential exits), each with a unique AGENT_NAME and its own -v state volume.
Base URL: https://api.proxies.sx
| Method | Path | Auth | Rate Limit | Description |
|---|---|---|---|---|
| POST | /v1/peer/agents/register | - | 600/min | Register AI agent as peer |
| POST | /v1/peer/agents/:id/refresh | Refresh | 10/min | Refresh JWT token |
| GET | /v1/peer/agents/:id/status | JWT | - | Get agent status and connection info |
| GET | /v1/peer/agents/:id/earnings | JWT | - | Get detailed earnings breakdown |
| PUT | /v1/peer/agents/:id/wallet | JWT | 1/day | Update payout wallet (7-day cooling) |
| POST | /v1/peer/agents/:id/withdraw | JWT | 3/hour | Request payout (min $5 USDC) |
| GET | /v1/peer/agents/stats/summary | - | - | Aggregate agent statistics |
| Method | Path | Auth | Description |
|---|---|---|---|
| POST | /v1/peer/register | - | Register device (Android SDK, 5/min per IP) |
| POST | /v1/peer/token/:deviceId/refresh | - | Get fresh token for device |
| GET | /v1/peer/device/:deviceId | JWT | Get device details |
| GET | /v1/peer/earnings/:deviceId | JWT | Get simple earnings (total & today) |
| GET | /v1/peer/devices/:deviceId/earnings | JWT | Detailed earnings with payout info |
| PUT | /v1/peer/devices/:deviceId/wallet | JWT | Update wallet addresses (1/day) |
| POST | /v1/peer/devices/:deviceId/request-payout | JWT | Request payout (3/hour) |
| POST | /v1/peer/devices/:deviceId/rotate | API Key | Trigger IP rotation on device (currently returns not-implemented - SDK Phase 3b, see Android SDK section) |
| POST | /v1/peer/devices/:deviceId/ip-changed | API Key | Record IP change from SDK |
| GET | /v1/peer/devices | Admin | List peer devices (admin-only for exit-IP privacy; sensitive fields stripped) |
| GET | /v1/peer/config | - | Get SDK configuration |
Customers route traffic through the unified pool gateway at
gw.proxies.sx:7000 (HTTP CONNECT) or
gw.proxies.sx:7001 (SOCKS5), authenticated with a
customer's psx_* username and proxy password - or a
pool access key (pak_*). The peer-fleet composition,
exit IPs, and per-device endpoints are not exposed publicly -
doing so historically resulted in anti-bot vendors pre-blacklisting
the entire inventory before any customer connected (DataDome t=bv
ban pattern). The gateway's /v1/gateway/pool/availability
returns coarse country counts only.
These endpoints are not yet deployed. Use the Agent Management endpoints above.
| Method | Path | Auth | Description |
|---|---|---|---|
| POST | /v1/peer-auth/register | - | Register peer user account |
| POST | /v1/peer-auth/login | - | Login to peer portal |
| GET | /v1/peer-auth/profile | JWT | Get user profile |
| POST | /v1/peer-auth/change-password | JWT | Change password |
| GET | /v1/peer-account/dashboard | JWT | Dashboard with stats and devices |
| GET | /v1/peer-account/devices | JWT | List linked devices |
| POST | /v1/peer-account/devices/link | JWT | Link a device to account |
| DELETE | /v1/peer-account/devices/:deviceId | JWT | Unlink device |
| GET | /v1/peer-account/earnings/summary | JWT | Earnings summary |
| GET | /v1/peer-account/payouts | JWT | Payout history |
| POST | /v1/peer-account/payouts/request | JWT | Request payout |
| GET | /v1/peer-account/wallets | JWT | Get wallet addresses |
| PUT | /v1/peer-account/wallets | JWT | Update wallets |
| PUT | /v1/peer-account/profile | JWT | Update profile |
| Method | Path | Auth | Description |
|---|---|---|---|
| PUT | /v1/peer/status/:deviceId | Internal Key | Update device status |
| POST | /v1/peer/traffic/batch | Internal Key | Record batch traffic |
| POST | /v1/peer/traffic/:deviceId | Internal Key | Record device traffic |
| POST | /v1/peer/classify-ip | Internal Key | Classify IP address |
| POST | /v1/peer/verify-token | Internal Key | Verify device token |
| POST | /v1/peer/devices/:deviceId/process-payout | Internal Key | Process payout (admin) |
| POST | /v1/gateway/auth | Internal Key | Authenticate proxy request |
Internal Key = internal service authentication (server-to-server only, not available to customers or peers). JWT = Authorization: Bearer <token>. API Key = X-API-Key header.
| Who | How | Why |
|---|---|---|
| AI agents between tasks | Register via API, connect WebSocket during idle time | Earn while waiting for user requests |
| Mobile app developers | Android SDK in background of any app | Monetize users' unused bandwidth - per-GB by IP type; mobile IPs earn the top tier (live rate: earningsPerGB at registration) |
| VPS owners | Docker container or Node.js process | Earn per-GB on idle server bandwidth |
| Crypto miners | Docker alongside mining rig | Double-use existing infrastructure |
| Home users | Windows desktop app or Node.js peer on your computer | Share a residential connection through the supported desktop setup |
| Bot operators | Add peer SDK to existing bot framework | Cover bot hosting costs with bandwidth sharing |
| Android app developers on 5G | Integrate the Android SDK into your app with user consent | Share the device's cellular connection |
| IoT fleets | Lightweight WebSocket client on devices | Monetize distributed device network |
Everything on this page reduces to one contract: deliver an HTTP proxy endpoint from a device with a real mobile or residential IP, and get paid per GB routed.
The relay server, gateway, SDKs, Docker images, and API are provided paths - not the only paths. If you can expose an HTTP proxy from a mobile phone, a residential router, a 5G hotspot, or any device with a real-world IP by another method, that method is accepted.
Input: A device with a real mobile/residential IP Output: An HTTP proxy endpoint that routes traffic through that device Result: We pay you per GB routed
The WebSocket relay is one path. The Android SDK is another. Docker is a third. A Raspberry Pi on a home network, a fleet of IoT devices, a custom SOCKS5-to-HTTP bridge, a mesh network, or something not yet on this list all qualify - the contract above is the only requirement.
Ready clients (Node.js, Go, Windows, Android) are listed once in Quick Start. All speak the identical relay protocol (register -> WebSocket -> binary tunnels -> nearest-relay redirect); each desktop/server client is a single file.
Your device showing online + verified at farmer.proxies.sx is a checkpoint. Confirm listing and successful customer routing, reconnects and metering before scaling; follow the staged Go guide. The optional self-test below is a customer-side request: run with verbose logging and send a request through your own device (curl -x "http://psx_ACCOUNTID-peer-COUNTRY-pin-device-DEVICEID:PROXY_PASSWORD@gw.proxies.sx:7000" https://api.ipify.org) - you should see TUNNEL_CONNECT then TCP_OPEN_OK in your peer log. It needs a proxy password (set at client.proxies.sx/account) and a small traffic balance; a 407 means the curl's credentials are missing/wrong, not that your peer is broken. Porting to another language? The two things that bite hand-written ports: put the JWT in the Sec-WebSocket-Protocol header as token.<jwt> (never in the URL), and on an auth-failure close refresh the identity once for all sockets (do not relaunch your whole socket pool - that leaks connections and dials with stale tokens). The Go file documents both inline.
| Approach | Description |
|---|---|
| Standard relay | WebSocket to relay.proxies.sx - documented above |
| Android SDK | Drop-in library for mobile apps - documented above |
| Docker | Container with WebSocket client - documented above |
| Custom proxy server | Run your own HTTP/SOCKS5 proxy, register it as a peer device, route traffic however you want |
| Hardware bridge | Raspberry Pi, router firmware, embedded device - if it has an IP and can forward HTTP, it works |
| Your invention | Something we haven't thought of. If it delivers an HTTP endpoint from a real IP, we want it. |
The only hard requirements: the IP must be real (server-side ASN classification determines type and rate), traffic must actually flow through your device, and you connect via the relay protocol so traffic can be routed and metered. Everything else - language, runtime, hardware, architecture - is your choice.
If a detail is undocumented, build against the relay protocol in /peer/skill.md and verify with the self-test above. The peer system accepts any device that can handle HTTP traffic.
More peers = more diverse IPs = better success rates for proxy customers = more traffic routed = more earnings for everyone.
The @proxies_sx Telegram channel provides onboarding for new peers. Share it with anyone interested in passive income.
AI agents can register in 2 API calls with no human intervention:
# 1. Register
curl -X POST 'https://api.proxies.sx/v1/peer/agents/register' \
-H "Content-Type: application/json" \
-d '{"name":"auto-agent","type":"custom","walletAddress":"SOLANA_WALLET"}'
# 2. Connect to relay with returned JWT
# (WebSocket connection - see Quick Start above)
# Docker one-liner: see Quick Start step 6 (node:20-alpine + reference-sdk.js).
# The client takes -e API_KEY=psx_... - it registers itself and manages its
# own JWT lifecycle; there is no prebuilt "proxies-peer" image to pull.
# Fleets: run one container per device/IP. Each container already gets a unique
# stable identity (its hostname) - just give each its OWN state volume
# (-e PEER_STATE_FILE=/state/id.json -v peerNN:/state). Never set the SAME
# AGENT_NAME on multiple containers (same name + same key = ONE shared device).
#
# What earns residential rate: the peer's ACTUAL outbound IP is what we classify
# and pay (device-reported type is ignored). One container per residential line
# earns residential; many containers behind one VPS all exit that VPS's single
# datacenter IP - so they earn datacenter tier and share one register limit.
#
# Relay per-IP admission is configurable; the old 50-socket figure is obsolete.
# Begin a reviewed pilot at WS_CONNECTIONS=1 and measure shared NAT limits.
# More devices behind the same IP do not provide more distinct exits.
# docker-compose with one service per real egress IP works well.
We welcome introductions to individual device owners and app or device-fleet operators. There is currently no automatic farmer-to-farmer referral commission program, personal supplier-referral link, or published percentage of another supplier's earnings.
Earlier examples of PEER_ codes and a 10% bonus for 30 days described a proposed program, not an active offer. Do not use those examples to promise earnings or assume referrals are tracked.
For a supplier introduction, email maya@proxies.sx with the countries, network types and approximate number of distinct connections the supplier can keep online. Agree attribution, qualification, duration and any compensation in writing before proceeding on the basis of a referral fee. Each supplier should register their own farmer account and use their own SDK key; do not share account credentials.
The customer affiliate program is separate: it applies to attributed proxy purchases, not a peer supplier's traffic earnings.
| Platform | Community | Approach |
|---|---|---|
| r/beermoney, r/passive_income | Share real earnings data and honest reviews | |
| Discord | Side hustle / crypto servers | Post in #earnings-reports channels |
| Twitter/X | @sxproxies | Quote tweets, earnings screenshots |
| Telegram | @proxies_sx | Direct onboarding channel |
| Hackathons | Web3 / AI events | Demo peer SDK integration |
| YouTube | Passive income creators | Setup tutorials and earnings reports |
Your device is yours. Stop or leave at any time, without asking us and without a notice period. Earnings already recorded stay on your account and are paid as usual, including for a device you deleted.
| Goal | What to do |
|---|---|
| Pause | Stop the SDK process, or switch the device off in the farmer dashboard. It goes offline, no traffic is routed to it, and the same identity resumes when you start again. |
| Delist (stay online, no customer traffic) | Switch Listed off for the device in the farmer dashboard, or send PATCH /v1/peer/my-devices/{deviceId}/listing with {"listedForSale":false}. The device stays connected and keeps its verification, but carries no customer traffic, and nothing lists it again until you do. |
| List again | Switch Listed back on, or send {"listedForSale":true}. A verified device is listed at once; an unverified one is listed automatically as soon as it passes verification. List All in the dashboard does this for every device. |
| Remove for good | Stop first, then delete. 1) Stop the SDK and make sure it cannot restart (Docker: docker rm -f proxies-peer && docker volume rm proxies-peer-state; Android: ProxiesPeerSDK.getInstance().stop() and remove the SDK from the app). 2) Delete the saved identity ~/.proxies-peer-state.json (or your PEER_STATE_FILE). 3) Delete the device in the farmer dashboard or with DELETE /v1/peer/my-devices/{deviceId} and your account API key. 4) Revoke the API key in the farmer portal if nothing else uses it. |
| Dead duplicates after a test run | In the farmer dashboard, Remove Stale deletes devices offline for more than a day and Remove All Offline deletes every device that is offline right now; online devices are never touched. With the API: POST /v1/peer/my-devices/cleanup-stale with {"olderThanDays":1}, or {"olderThanDays":0} for everything offline now. |
| Bring back a deleted device | Start the SDK again with the same saved identity. The device re-registers, is restored to your list and goes through verification if it needs to. |
Why the order matters: a device that reports online again is restored automatically, so deleting one whose SDK is still running does not last. Exact requests and responses are in skill.md under “Stop Sharing or Remove a Device”. Apple Silicon compute nodes have a one-command removal: Pause or remove your Mac.
| Feature | Value | Purpose |
|---|---|---|
| JWT expiry | 1 hour | Minimize token theft window |
| Refresh token expiry | 7 days | Re-register if expired |
| WebSocket auth | Sec-WebSocket-Protocol header | Secure token transport (not URL) |
| Token revocation | DB-level check on every request | Instant invalidation (generation counter + revoked flag) |
| SDK endpoint auth | All endpoints require JWT | No unauthenticated access to device data |
| Registration rate limit | 600/min (agents), 5/min (SDK) | Prevent mass registration |
| Token refresh rate limit | 10/min | Prevent abuse |
| Wallet change rate limit | 1/day | Prevent rapid switching |
| Wallet cooling period | 7 days | Fraud prevention after wallet change |
| Withdrawal rate limit | 3/hour | Prevent rapid drain |
| WebSocket message limit | 100/min per device | Prevent flooding |
| Max WebSockets | 6 per device (over-cap evicts oldest, close 4008) | Bound leaks and connection spam |
| IP classification | Server-side ASN lookup | Cannot spoof IP type for higher earnings |
| Traffic validation | Max 1GB per call | Prevent inflated earnings reports |
| Anomaly detection | Flags >$1000 earnings or >100GB/hour | Catch suspicious activity |
| IPv6 SSRF blocklist | fe80::/10, fc00::/7 blocked | Prevent internal network access |
| Payouts use registered wallet | Parameter ignored if wallet set | Prevent payout redirection |
GitHub: github.com/bolivian-peru/android-peer-sdk
For app developers. This SDK is a library to integrate into an Android app project. A standalone APK for adding your personal phone is not currently available to download here.
The Android SDK is currently in beta. API surface may change. Report issues on GitHub.
// build.gradle (app-level)
implementation("com.github.bolivian-peru:android-peer-sdk:1.3.2")
// settings.gradle - add JitPack
dependencyResolutionManagement {
repositories {
maven { url 'https://jitpack.io' }
}
}
// Initialize
ProxiesPeerSDK.init(context, "api-key", config)
// Start sharing bandwidth
ProxiesPeerSDK.getInstance().start()
// Stop sharing
ProxiesPeerSDK.getInstance().stop()
SDK-side IP rotation (airplane-mode toggle on non-rooted Android) is on the roadmap but not in v1.1.x. Tracked under Phase 3b of the SDK production-readiness plan. The backend route POST /v1/peer/devices/:id/rotate exists but returns 501 for v1.1.x devices until the SDK ships an AirplaneModeAccessibilityService.
App developers integrate the SDK and earn a revenue share of the revenue collected on each GB routed through their users' devices, paid NET. Your payout is a revenue share set by Proxies.sx and customized per partner - there is no fixed public percentage; rates are configured by our team, can be tailored to you, and move with demand. Earnings accumulate automatically - the live per-GB rate is set by IP type (mobile > residential > datacenter), classified server-side via ASN lookup.
Contact us for custom SDK integration terms and revenue splits.
| File | URL | Purpose |
|---|---|---|
| skill.md | /peer/skill.md | Full peer API skill file for AI agents |
| Master skill | /skill.md | Everything in one read |
| llms.txt | /llms.txt | LLM integration reference |
| x402.json | /.well-known/x402.json | x402 protocol discovery |
| Domain | Purpose |
|---|---|
| api.proxies.sx | REST API + x402 + peer endpoints |
| agents.proxies.sx | Agent infrastructure hub |
| relay.proxies.sx | WebSocket relay for peer devices |
| gw.proxies.sx | HTTP proxy gateway |
| Repository | Description |
|---|---|
| android-peer-sdk | Android SDK for bandwidth sharing |
| proxies-sx-mcp-server | MCP server (70 tools published on npm) |
| x402-sdk | x402 payment protocol SDK |
Email maya@proxies.sx or message https://t.me/proxies_sx. If a gateway error gave you a req: id, quote it.