PARTNER PROGRAM · API V1

Reseller API

Sell dedicated 5G mobile proxies under your own brand. Check live stock, purchase, renew, and rotate credentials — programmatically, at your wholesale rate, funded from a prepaid wallet.

BASE URL
https://whitecloakproxy.com/api/reseller/v1

01 — ACCESS

Authentication

Every request carries your API key in the Authorization header. Keys are issued to approved partners only — treat yours like a password: anyone holding it can spend your balance. If it leaks, contact us immediately and we'll rotate it. Requests are limited to 60 per minute.

Support: [email protected] — include your request's idempotency_key or charge_id when reporting a payment issue.

HEADER
Authorization: Bearer wcr_your_api_key_here

02 — MONEY

Billing model

Prepaid wallet

You pay us off-platform; we credit your wallet. Every purchase and 30-day extension debits it at your agreed flat rate per proxy.

Prices in cents

Every amount in every response is US cents — 6500 means $65.00. No floats, no surprises.

Fail-safe charges

If your balance can't cover a request it fails with 402 and nothing is charged or provisioned.

Automatic refunds

If provisioning fails on our side after a charge, the failed units are refunded to your wallet automatically.

Each proxy is a dedicated US mobile device — one device, one customer, never shared — reachable over HTTP and SOCKS5 with a shared password, plus a rotation link your systems can call any time for a fresh IP. Proxies run 30 days and extend in 30-day blocks.

03 — REFERENCE

Endpoints

GET/account

Account

Your wallet balance, contracted per-proxy rate, and how many proxies you currently hold.

REQUEST
curl -H "Authorization: Bearer $KEY" \
  https://whitecloakproxy.com/api/reseller/v1/account
RESPONSE · 200
{
  "success": true,
  "name": "Partner Site",
  "balance_cents": 130000,
  "price_per_proxy_cents": 6500,
  "active_proxies": 12,
  "max_active_proxies": null,
  "billing_mode": "wallet"
}
  • All prices everywhere in this API are US cents — 6500 means $65.00.
  • Watch balance_cents and top up with us before it runs low; purchases fail cleanly with 402 when it can't cover them.
  • billing_mode is either "wallet" (the default, prepaid balance above) or "card" (pay-per-order — see the Purchase endpoint's card billing note). Card accounts always report balance_cents: null here and add a card block: { "last4": "4113", "brand": "VISA" }.
GET/inventory

Inventory

Live purchasable stock, grouped by carrier and US state. Counts refresh continuously.

REQUEST
curl -H "Authorization: Bearer $KEY" \
  https://whitecloakproxy.com/api/reseller/v1/inventory
RESPONSE · 200
{
  "success": true,
  "total_available": 37,
  "stock": [
    { "carrier": "T-Mobile", "state": "FL", "count": 9 },
    { "carrier": "T-Mobile", "state": "NY", "count": 14 },
    { "carrier": "Verizon",  "state": "NY", "count": 8 },
    { "carrier": "Verizon",  "state": "TX", "count": 6 }
  ]
}
  • Stock can sell out between a check and a purchase — you'd get a clean 409, never a wrong proxy.
POST/purchase

Purchase

Buy 1–20 proxies in one call. carrier and state are guarantees: every delivered proxy matches them, or the call fails before anything is charged.

FIELDTYPE
quantityREQUIREDinteger
carrierstring
statestring
idempotency_keystring
REQUEST
curl -X POST \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "quantity": 2,
    "carrier": "Verizon",
    "state": "NY",
    "idempotency_key": "your-order-8841"
  }' \
  https://whitecloakproxy.com/api/reseller/v1/purchase
RESPONSE · 200
{
  "success": true,
  "purchased": [
    {
      "proxy_id": "1f6f2a34-....",
      "carrier": "Verizon",
      "state": "NY",
      "host": "relay7.pprx.io",
      "password": "kJ2mPq9xL4",
      "http":   { "port": 10412, "username": "u8842" },
      "socks5": { "port": 10413, "username": "u8842" },
      "rotation_url": "https://pprx.io/r/AbC123xYz",
      "expires_at": "2026-08-04T18:20:11.000Z"
    }
  ],
  "failed_count": 0,
  "charged_cents": 13000,
  "balance_cents": 117000
}
  • Always send an idempotency_key (e.g. your internal order ID). If your request times out and you retry with the same key, you get the original result back instead of being charged twice. A retry while the original is still processing returns 409 — wait and retry again.
  • Use a generous HTTP timeout (120s+): provisioning happens live, one device at a time.
  • Store proxy_id — it's the handle for extend and reset-password.
  • failed_count > 0 means some units couldn't be provisioned and were refunded automatically; purchased contains only real, working proxies.
  • Proxies run for 30 days from purchase.
  • Card billing (opt-in): card payments are processed by Intuit Payments Inc. (QuickBooks Payments). Accounts with billing_mode "card" skip the wallet entirely. We send you a one-time save-card link — card details are entered and tokenized client-side and never touch our servers — and every purchase after that charges the saved card directly, settling instantly. For these accounts balance_cents is always null and the response adds a payment block that doubles as your per-transaction receipt: { "method": "card", "charge_id": "MT1a2b3c4d", "last4": "4113", "paid_at": "<ISO timestamp>", "processed_by": "Intuit Payments Inc." }.
  • Card billing errors (billing_mode "card" only): 402 { "error": "No card on file. Save a card via your setup link before purchasing." } if you haven't saved a card yet; 402 with a card-specific reason (e.g. "Your card was declined. Please try a different card or contact your bank." or "Your card has expired. Please update your card details.") on a definitive decline; 502 { "error": "Payment status unknown — do not retry; contact support before trying again." } if we couldn't confirm the outcome after a timeout, or a plain 5xx if Intuit's payment_unavailable — in either 5xx case, do not retry blindly; contact support first.
  • Card billing partial failures: if some (not all) units fail to provision after a successful card charge, exactly one partial refund is issued automatically. refund_pending_cents plus a warning only appear if that refund itself failed (rare — our team is alerted) — same convention as the wallet path's refund_pending_cents.
GET/proxies

List proxies

Every active (unexpired) proxy you hold, soonest-expiring first. Same unit shape as the purchase response.

REQUEST
curl -H "Authorization: Bearer $KEY" \
  https://whitecloakproxy.com/api/reseller/v1/proxies
RESPONSE · 200
{
  "success": true,
  "count": 12,
  "proxies": [ { "proxy_id": "...", "expires_at": "...", ... } ]
}
  • Poll this daily and renew anything expiring within a day or two — expired proxies are released back to the pool and cannot be recovered.
POST/proxies/extend

Extend

Extend one proxy by 30 days at your flat rate. Extending early never loses time — the 30 days stack onto the current expiry.

FIELDTYPE
proxy_idREQUIREDstring
REQUEST
curl -X POST \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"proxy_id": "1f6f2a34-...."}' \
  https://whitecloakproxy.com/api/reseller/v1/proxies/extend
RESPONSE · 200
{
  "success": true,
  "proxy_id": "1f6f2a34-....",
  "expires_at": "2026-09-03T18:20:11.000Z",
  "charged_cents": 6500,
  "balance_cents": 110500
}
  • Send one extend per proxy at a time: if two race, the second is detected, refunded, and answered with 409 — treat that as "already extended" and re-check GET /proxies.
  • A 410 means the proxy already expired and was released — it cannot be brought back.
POST/proxies/reset-password

Reset password

Generate a fresh password for one proxy — HTTP and SOCKS5 both switch within about a second. Use it when handing a proxy to a different end customer.

FIELDTYPE
proxy_idREQUIREDstring
REQUEST
curl -X POST \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"proxy_id": "1f6f2a34-...."}' \
  https://whitecloakproxy.com/api/reseller/v1/proxies/reset-password
RESPONSE · 200
{
  "success": true,
  "proxy_id": "1f6f2a34-....",
  "password": "nEw9pAsS2q"
}

04 — FAILURE

Errors

Errors always return { "error": "human-readable message" }.

400Invalid request body or parameters
401Missing or invalid API key
402Wallet accounts: insufficient balance (required_cents included). Card accounts: no card on file, or the card was declined/expired.
403Key deactivated, or purchase would exceed your proxy cap
404proxy_id not found (or not yours)
409Not enough matching stock, duplicate in-flight request, or raced extend
410Proxy already expired/released — cannot be extended
429Rate limit exceeded (60 requests/minute)
500Something failed on our side; any charge was refunded (or a refund is pending — see refund_pending_cents)
502Card accounts only: payment outcome could not be confirmed after a timeout — do not retry; contact support

05 — SHIP IT

Recommended integration

  1. 1

    Show stock

    Pull GET /inventory and present purchasable carriers and states to your customers.

  2. 2

    Sell & deliver

    Customer pays on your site → POST /purchase with their chosen carrier/state → hand them the host, ports, username, password, and rotation URL.

  3. 3

    Renew daily

    A daily job lists GET /proxies and extends anything expiring soon — or lets it lapse if your customer didn't renew.

  4. 4

    Stay funded

    Watch GET /account and top up with us before your balance runs low.

BECOME A PARTNER

Need an API key?

Reseller access is invite-only. Tell us about your volume and your audience and we'll set you up with a wholesale rate and a prepaid wallet.

Contact us