Per-GB rates set per partner by IP type: mobile highest, residential mid, datacenter not listed. Listed traffic needs your own account-linked API key. Register, pass the self-test, then scale.
Rates are set per partner and may be fixed or a share of collected revenue. There is no universal public percentage. Your live per-GB rate is the earningsPerGB value returned when you register a device. Registration does not guarantee traffic or earnings: earnings depend on eligible traffic your devices actually serve and on your active partner terms.
Step-by-step guides:Supply bandwidthLinuxWindowsDockerAI agentAndroid SDKWhat runs on my device
Customers pay because real residential and mobile IPs are the only way to gather public data intelligence at scale — modern sites block datacenter IPs quickly. That is why mobile and residential IPs are the ones that get listed.
All public-web data only. No login walls, no private accounts, no email/identity. Standard data-intelligence work that companies have done for years, now increasingly run by AI agents.
Pick your path
Same relay, same protocol, same account. Choose what matches your hardware, and only connect devices whose owners have given informed consent.
JitPack dependency · a few lines of Kotlin · mobile carrier ASNs are the highest tier. Open source (MIT), beta, minSdk 24 (Android 7.0).
// build.gradle
implementation("com.github.bolivian-peru:android-peer-sdk:1.3.2")
// MyApplication.kt
ProxiesPeerSDK.init(
context = this,
apiKey = "psx_YOUR_KEY", // farmer.proxies.sx/api-keys?purpose=sdk
config = ProxiesPeerSDK.Config(userId = "optional-user-id")
)
ProxiesPeerSDK.getInstance().start()Always-on box on a home connection: Pi, NAS, mini PC. Run the Node reference client (1.6.0), or the headless Go 1.6.1 binary for Linux x86-64. Datacenter and VPS IPs are rejected for listing.
# Node reference client (registers, connects, refreshes and reconnects for you)
curl -O https://agents.proxies.sx/peer/reference-sdk.js
API_KEY=psx_YOUR_KEY node reference-sdk.js
# Or in a container
docker run -d --name proxies-peer --restart unless-stopped \
-e API_KEY=psx_YOUR_KEY \
-v "$PWD/reference-sdk.js:/app/reference-sdk.js:ro" -w /app \
node:20-alpine node reference-sdk.jsOne register call + a WebSocket · any language · register with type claude, gpt or custom.
// Node.js — same protocol in Python, Go, Rust
const ws = new WebSocket(register.relay, [`token.${JWT}`]);
ws.on('open', () => {
ws.send(JSON.stringify({ type: 'device_info', payload: { protocol: 'binary-v1' } }));
setInterval(() => ws.send(JSON.stringify({ type: 'heartbeat', payload: {} })), 30000);
});
// Relay sends tunnel_connect {sessionId, host, port}: open TCP to host:port,
// reply tunnel_connected, then pump raw bytes both ways as binary-v1 frames.What you need
| Required | Why | How to get |
|---|---|---|
| Solana wallet | Device withdrawals go here · 7-day cooling after change | Phantom · Solflare · any SPL wallet |
| API key (required for listed traffic) | Links the device to the account responsible for its consent and management | farmer.proxies.sx/api-keys?purpose=sdk |
| Consented connection | Mobile carrier IPs are the highest tier · residential mid · datacenter not listed | Only devices whose owners have given informed consent |
Same protocol — write your own client
JSON control messages over WebSocket (device_info, tunnel_connect, tunnel_connected, tunnel_closed, heartbeat every 30s) plus raw tunnel bytes in binary-v1 frames. Full schema in skill.md.
| Language | WebSocket lib | Reference |
|---|---|---|
| JavaScript / Node.js | ws | reference-sdk.js (1.6.0) |
| Python | websockets | skill.md |
| Go | gorilla/websocket | reference-sdk.go (1.6.1) |
| Rust | tokio-tungstenite | skill.md |
| Kotlin / Java | Use the SDK | Android SDK |
| Bash + websocat | websocat | For demos — not production |
Earnings breakdown
Per-GB rates
| IP type | Rate | Detection | Examples |
|---|---|---|---|
| Mobile | Top tier · highest $/GB | Server ASN lookup | AT&T · Verizon · T-Mobile · Vodafone · O2 |
| Residential | Mid tier | Server ASN lookup | Comcast · Spectrum · Cox · BT · Deutsche Telekom |
IP type is determined server-side via ASN lookup; device-reported type is ignored. Datacenter IPs are rejected for listing. Rates themselves come from earningsPerGB, not from this table.
How earnings work
Rates are set per partner and may be a fixed rate or a share of collected revenue. There is no universal public percentage. Your live per-GB rate is the earningsPerGB value returned when you register a device; the skill.md spec shows the exact JSON shape. Mobile is the highest tier and residential the middle; datacenter IPs are not listed.
Registration does not guarantee traffic or earnings. Earnings depend on eligible traffic your devices actually serve and on your active partner terms.
Coming from another network?
Side-by-side comparisons with the major bandwidth-sharing apps.
Build something with peer earnings
The earned USDC is yours to spend. Two patterns we've documented:
Payout details
| Detail | Value |
|---|---|
| Rate | Set per partner · live value in earningsPerGB at registration |
| Farmer-account payouts | Native SOL on Solana · native BTC · USDC on Solana · manual requests from $0.01 of approved earnings |
| Device withdrawal API | $5 minimum (AI agents) · $10 (Android SDK devices) · 3 requests/hour · registered wallet only |
| Wallet change | Once per 24 hours, then 7-day cooling before payouts |
| Timing | Confirm with support: maya@proxies.sx |
How it works
POST a name, type (claude, gpt or custom), Solana wallet and your apiKey (psx_...). Get back a deviceId, JWT, refresh token and relay.
Open the relay from the register response (the relay field — geo-assigned, e.g. relay-us for US/LATAM) with Sec-WebSocket-Protocol: token.<JWT>. Send device_info.
Relay sends tunnel_connect for HTTP and HTTPS alike. Open TCP to host:port, reply tunnel_connected, forward raw bytes (binary-v1). Send a heartbeat every 30s.
Eligible traffic is credited under your partner terms. Run the self-test first, then request a payout when eligible.
Architecture
+-----------------+ +------------------+ +------------------+
| Your Device |---->| Relay Server |<----| Proxy Gateway |
| (Peer Node) | | (WebSocket Hub) | | (HTTP Proxy) |
+-----------------+ +------------------+ +------------------+
| | |
| Share bandwidth | Match peers | Accept customer
v | to requests | connections
+-----------------+ +------------------+ +------------------+
| Metered per GB | | wss://relay | | gw.proxies.sx |
| Partner terms | | .proxies.sx | | port 7000 |
| Request payout | | | | |
+-----------------+ +------------------+ +------------------+Relay — WebSocket hub that holds peer connections and routes proxy traffic. Gateway — HTTP/SOCKS5 proxy server that paying customers connect to. Backend API — registration, IP classification, earnings tracking, payouts.
Quick start
1. Register
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...",
# "refreshToken": "a1b2...",
# "relay": "wss://relay.proxies.sx",
# "earningsPerGB": { ... } <- your live rate, the only authoritative number
# }type is one of claude, gpt or custom. JWT lasts 1 hour; the refresh token lasts 7 days — POST it to /v1/peer/agents/{deviceId}/refresh for a new JWT. apiKey is required for listed traffic — create one at farmer.proxies.sx/api-keys?purpose=sdk (SDK / device preset). Anonymous registration does not qualify for listed customer traffic.
2. Connect via WebSocket
// Use the relay returned by the register response — do NOT hardcode.
// The platform geo-assigns the nearest relay (US/LATAM peers get
// wss://relay-us.proxies.sx). Honor relay_redirect for runtime migration.
const net = require('net');
const WebSocket = require('ws');
const ws = new WebSocket(registerResponse.relay, [`token.${JWT}`]);
const tunnels = new Map();
const frame = (type, sid, data) => Buffer.concat([
Buffer.from([type, Buffer.byteLength(sid)]), Buffer.from(sid), data || Buffer.alloc(0),
]);
ws.on('open', () => {
ws.send(JSON.stringify({ type: 'device_info', payload: { country: 'US', protocol: 'binary-v1' } }));
// The PEER sends a heartbeat every 30s; the relay replies heartbeat_ack.
setInterval(() => ws.send(JSON.stringify({ type: 'heartbeat', payload: {} })), 30000);
});
ws.on('message', (raw, isBinary) => {
if (isBinary && raw[0] !== 0x7B) { // binary-v1: 0x01 data, 0x03 close
const sid = raw.subarray(2, 2 + raw[1]).toString();
const sock = tunnels.get(sid);
if (raw[0] === 0x01 && sock) sock.write(raw.subarray(2 + raw[1]));
if (raw[0] === 0x03 && sock) sock.destroy();
return;
}
const msg = JSON.parse(raw.toString());
if (msg.type === 'tunnel_connect') { // HTTP and HTTPS both arrive here
const { sessionId, host, port } = msg.payload;
const sock = net.connect(port, host);
sock.setNoDelay(true);
tunnels.set(sessionId, sock);
sock.on('connect', () => ws.send(JSON.stringify({ type: 'tunnel_connected', payload: { sessionId } })));
sock.on('data', (d) => ws.send(frame(0x01, sessionId, d))); // raw bytes, untouched
sock.on('close', () => {
tunnels.delete(sessionId);
ws.send(JSON.stringify({ type: 'tunnel_closed', payload: { sessionId } }));
});
}
});Connect for fastest throughput
- Run the current clients — Node reference 1.6.0, Go headless Linux 1.6.1, Android SDK 1.3.2.
- Connect to the relay from the register response (the relay field) — never hardcode wss://relay.proxies.sx. US/LATAM peers are routed to wss://relay-us.proxies.sx; honor relay_redirect for runtime migration.
- Use the binary tunnel protocol (binary-v1) — lower overhead than JSON.
- Persist your device id so a restart keeps earnings/status instead of re-registering as a new device.
- Parallel sockets: up to 6 WebSockets per device; the Node reference client opens 4 by default. Grab it at agents.proxies.sx/peer/reference-sdk.js.
3. Check earnings
curl -s "https://api.proxies.sx/v1/peer/agents/${DEVICE_ID}/earnings" \
-H "Authorization: Bearer $JWT" | jq4. Request payout
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"}'5. Run the reference client in a container
# The Node reference client registers, connects and refreshes on its own
curl -O https://agents.proxies.sx/peer/reference-sdk.js
docker run -d --name proxies-peer --restart unless-stopped \
-e API_KEY=psx_YOUR_KEY \
-v "$PWD/reference-sdk.js:/app/reference-sdk.js:ro" -w /app \
node:20-alpine node reference-sdk.js6. Self-test before you scale
curl -s -X POST "https://api.proxies.sx/v1/peer/my-devices/${DEVICE_ID}/test" \
-H "X-API-Key: psx_YOUR_API_KEY" | jqRuns the same CONNECT + TLS + HTTP request a customer would. Takes your account API key, not the registration JWT.
All peer API endpoints
Base URL: https://api.proxies.sx
Agent management
| Method | Path | Auth | Rate limit | Description |
|---|---|---|---|---|
| POST | /v1/peer/agents/register | — | 3/min | Register agent as peer |
| POST | /v1/peer/agents/:id/refresh | Refresh | 10/min | Refresh JWT token |
| GET | /v1/peer/agents/:id/status | JWT | — | Status + connection info |
| GET | /v1/peer/agents/:id/earnings | JWT | — | Detailed earnings breakdown |
| PUT | /v1/peer/agents/:id/wallet | JWT | 1/day | Update wallet (7-day cooling) |
| POST | /v1/peer/agents/:id/withdraw | JWT | 3/hour | Request payout to registered wallet |
| POST | /v1/peer/my-devices/:id/test | Account API key | 5/min | End-to-end tunnel self-test |
| GET | /v1/peer/agents/stats/summary | — | — | Aggregate agent statistics |
Device management
| Method | Path | Auth | Description |
|---|---|---|---|
| POST | /v1/peer/register | — | Register device (Android SDK) |
| GET | /v1/peer/device/:deviceId | — | Device details |
| GET | /v1/peer/earnings/:deviceId | — | Simple earnings (total + today) |
| GET | /v1/peer/devices/:deviceId/earnings | — | Detailed earnings + payout info |
| PUT | /v1/peer/devices/:deviceId/wallet | — | Update wallet addresses |
| POST | /v1/peer/devices/:deviceId/request-payout | — | Request payout |
| POST | /v1/peer/devices/:deviceId/rotate | API Key | Trigger IP rotation |
| POST | /v1/peer/devices/:deviceId/ip-changed | API Key | Record IP change from SDK |
| GET | /v1/peer/devices | — | List peer devices |
| GET | /v1/peer/config | — | SDK configuration |
Proxy / network
| Method | Path | Auth | Description |
|---|---|---|---|
| GET | /v1/peer/proxy/devices | — | List online peer devices |
| POST | /v1/peer/proxy/request | API Key | Route HTTP request through a peer |
| GET | /v1/peer/proxy/test/:deviceId | — | Test proxy via device (ipinfo.io) |
| GET | /v1/peer/proxy/connect-string/:deviceId | — | Get proxy credentials string |
| GET | /v1/peer/proxy/credentials | — | All online device credentials |
| GET | /v1/peer/stats/online | — | Online device stats by country |
Internal (relay/gateway only)
| 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/classify-ip | Internal Key | Classify IP address |
| POST | /v1/peer/verify-token | Internal Key | Verify device token |
| POST | /v1/gateway/auth | Internal Key | Authenticate proxy request |
Internal Key = X-Internal-Key header · JWT = Authorization: Bearer · API Key = X-API-Key header.
Use cases
| Who | How | Why |
|---|---|---|
| AI agents on a consented connection | Register via API (type claude, gpt or custom), connect WebSocket during idle | Serve eligible traffic between tasks |
| Mobile app developers | Android SDK where proxying is the app's primary, user-facing purpose | Terms agreed per partner |
| Home server owners | Node reference client or Go binary on a Pi, NAS or mini PC | Residential tier |
| Home users | Android SDK on a spare phone or the reference client on a desktop | Share a consented home connection |
| Bot operators | Add the relay protocol to an existing bot framework on a residential or mobile IP | Offset hosting costs |
| 5G hotspot users | Android SDK on hotspot device | Mobile tier (highest) |
| IoT fleets | Lightweight WebSocket client on devices | Monetize distributed device network |
The goal: HTTP endpoint from great IPs
Everything boils down to one thing: get us an HTTP proxy endpoint from a device with a valuable IP address.
We provide the relay, gateway, reference clients, Android SDK and API. But the methods documented here are not the only way. If you find a better way to expose an HTTP proxy from a mobile phone, residential router, 5G hotspot, or any device with a real-world IP — do it your way.
Input: A device with a real mobile/residential IP Output: An HTTP proxy endpoint that routes traffic through it Result: Eligible traffic is paid under your partner terms
| Approach | Description |
|---|---|
| Standard relay | WebSocket to relay.proxies.sx — documented above |
| Android SDK | Drop-in library for mobile apps — documented above |
| Linux / Windows reference clients | Node 1.6.0 and Go 1.6.1 clients — documented above |
| Custom proxy server | Run your own HTTP/SOCKS5 proxy, register as peer device |
| Hardware bridge | Raspberry Pi, router firmware, embedded device |
| Your invention | Something we haven't thought of. Build it, test it, ship it. |
Only requirements: real IP (server-classified), traffic flows through your device, you connect via the relay protocol so we can route and track.
Growing the network
There is no supplier referral programme. Supplier introductions: maya@proxies.sx, with any terms agreed in writing.
Security & trust
| 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 check every request | Instant invalidation |
| Registration rate limit | 3/min IP (agents) · 5/min (SDK) | Prevent mass registration |
| Wallet change rate limit | 1/day | Prevent rapid switching |
| Wallet cooling period | 7 days | Fraud prevention after change |
| Withdrawal rate limit | 3/hour | Prevent rapid drain |
| WS message rate limit | 100/min per device | Prevent flooding |
| Max connections | Up to 6 WebSockets per device | A 7th evicts the oldest (close 4008) |
| IP classification | Server ASN lookup | Cannot spoof IP type |
| Traffic validation | Max 1 GB per call | Prevent inflated reports |
| Anomaly detection | >$1000 earnings or >100 GB/hour flagged | Catch suspicious activity |
| IPv6 SSRF blocklist | fe80::/10, fc00::/7 blocked | No internal network access |
| Payouts to registered wallet | Body parameter ignored if wallet set | No payout redirection |
Android SDK
GitHub: bolivian-peru/android-peer-sdk. Currently in beta — API surface may change. Report issues on GitHub.
Installation
// settings.gradle — add JitPack
dependencyResolutionManagement {
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
// build.gradle (app-level)
implementation("com.github.bolivian-peru:android-peer-sdk:1.3.2")Usage
// Merged permissions: INTERNET, ACCESS_NETWORK_STATE, ACCESS_WIFI_STATE,
// FOREGROUND_SERVICE, FOREGROUND_SERVICE_DATA_SYNC, WAKE_LOCK, READ_PHONE_STATE.
// Request POST_NOTIFICATIONS at runtime on Android 13+.
ProxiesPeerSDK.init(
context = applicationContext,
apiKey = "psx_YOUR_KEY", // farmer.proxies.sx/api-keys?purpose=sdk
config = ProxiesPeerSDK.Config(
userId = "optional-user-id",
onStatusChange = { status -> /* connecting | connected | error */ },
onEarningsUpdate = { earnings -> /* totals reported by the API */ },
)
)
ProxiesPeerSDK.getInstance().start() // foreground service starts
ProxiesPeerSDK.getInstance().stop()IP rotation via accessibility serviceRoadmap — not yet in the Android SDK
Planned for a future Android SDK release: on non-rooted Android, IP rotation would toggle airplane mode via an Accessibility Service. On-demand IP rotation is not shipped in the Android SDK today. The API below is a preview of the planned interface and is not yet shipped.
if (sdk.isIPRotationAvailable()) {
sdk.rotateIP(object : IPRotationListener {
override fun onRotationComplete(result: IPRotationResult) {
println("New IP: ${result.newIp}")
}
})
} else {
sdk.openIPRotationSettings()
}
// Coroutine version
val result = sdk.rotateIPAsync()IP rotation messages
| Message type | Direction | Payload |
|---|---|---|
| rotate_ip_request | Relay → Device | { requestId, reason } |
| rotation_complete | Device → Relay | { requestId, success, newIp, error } |
| ip_update | Device → Relay | { deviceId, newIp, timestamp } |
| ip_update_ack | Relay → Device | { success, newIp } |
App developers: terms are agreed per partner — contact maya@proxies.sx. Google Play permits proxy functionality for third parties only where it is the app's primary, user-facing purpose, and holds apps responsible for their SDKs.
Services marketplace
Peers who share bandwidth can also build and list services on the Proxies.sx Marketplace. One registration → two independent capabilities:
| Capability | Description | Toggle |
|---|---|---|
| Bandwidth sharing | Serve eligible traffic | ON / OFF |
| Service listing | Build bots/APIs, gate with x402, list for others | Active / Inactive |
Same wallet, same account, same reputation. Browse the Marketplace →
Links
Discovery files
| 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 |
Live domains
| 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 (port 7000) · SOCKS5 (7001) |
GitHub
Social
For full API surface and discovery, AI agents fetch agents.proxies.sx/peer/skill.md.