QuantumProxy API v1

REST API for managing your mobile proxies from your own application. Authenticate once with a bearer key, get and rotate proxies, pull usage. All proxies under your account; tenant-isolated.

Authentication

Every request needs an Authorization header carrying your API key:

Authorization: Bearer qp_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Keys are issued by your QuantumProxy operator. Each key is tied to one account; it only sees proxies under that account. Keep your key secret — anyone with it can rotate your proxies and read your usage. Revoke + re-issue at any time.

Base URL

https://app.quantumhproxy.com/v1

Endpoints

List your proxies

GET /v1/proxies
curl -H "Authorization: Bearer qp_live_..." \
     https://app.quantumhproxy.com/v1/proxies

Returns an array of every proxy in your account with current online state, exit IP, delivery strings (passwords masked), auto-rotate setting, and expiry.

Get one proxy

GET /v1/proxies/{id}
curl -H "Authorization: Bearer qp_live_..." \
     https://app.quantumhproxy.com/v1/proxies/ap-ggMrblS6

Rotate IP

POST /v1/proxies/{id}/rotate
curl -X POST -H "Authorization: Bearer qp_live_..." \
     https://app.quantumhproxy.com/v1/proxies/ap-ggMrblS6/rotate

Returns immediately with {"ok":true,"queued":true}. The new IP appears on the proxy within ~10 seconds. If the proxy has a per-proxy rotation rate-limit and you hit it inside the window, you get 429 with Retry-After header.

Update settings

PATCH /v1/proxies/{id}
curl -X PATCH -H "Authorization: Bearer qp_live_..." \
     -H "Content-Type: application/json" \
     -d '{"label":"reseller PA #14","auto_rotate_minutes":30}' \
     https://app.quantumhproxy.com/v1/proxies/ap-ggMrblS6

Allowed fields: label, auto_rotate_minutes. Other fields (ports, passwords, expiry, enable/disable) are operator-only.

Bandwidth usage history

GET /v1/proxies/{id}/usage?days=30

Returns daily byte totals for the last N days (default 30, max 365).

Rotation history

GET /v1/proxies/{id}/rotations?limit=50

Returns the last N rotations (default 50, max 500) with status ok/fail and the new IP on success.

List your devices (phones)

GET /v1/devices
curl -H "Authorization: Bearer $API_KEY" \
     https://app.quantumhproxy.com/v1/devices

Phone-level view scoped to your account. Returns id, name, online status, rotating flag, last seen timestamp, last known exit IP, lifetime bytes, and the AP id(s) this device serves. Use this for fleet monitoring; use /v1/proxies for proxy-level info.

IP history

GET /v1/proxies/{id}/ip-history?limit=100

Returns successful IP changes for a proxy with date + ipv4 fields. Optional from/to unix-second filters. Mirrors iProxy's ip-history shape.

Uptime

GET /v1/proxies/{id}/uptime?from=&to=&bucket=300

5-minute (default) buckets of online/offline/nodata status. Default window: last 24 hours, max 24 hours per request. Bucket size 60..3600 seconds. Useful for SLA dashboards.

Response: {"bucket_seconds":300,"from":...,"to":...,"uptime":[{"date":"...","status":"online|offline|nodata"}]}

Command (rotate / future actions)

POST /v1/proxies/{id}/command
curl -X POST -H "Authorization: Bearer $API_KEY" \
     -H "Content-Type: application/json" \
     -d '{"action":"changeip"}' \
     https://app.quantumhproxy.com/v1/proxies/ap-XXXXXXXX/command

iProxy-shaped action endpoint. Today supports changeip (alias rotate). Returns {"message":"changeip command has been sent"}. Unsupported actions return HTTP 501 so client code can detect feature gaps cleanly. Future: reboot, refresh, toggle_proxy when the APK lands matching handlers.

Move a connection to a new phone (connection pin)

Step 1 — get your connection id. List your connections and copy the id of the one you want to move. The ap-YOURID below is a placeholder: replace it with a real id from this list, or you will get 404 proxy not found.

curl -H "Authorization: Bearer $API_KEY" \
     https://app.quantumhproxy.com/v1/proxies
# iProxy shape: GET https://app.quantumhproxy.com/api/console/v1/connection

Step 2 — mint the pin for that id (valid 10 minutes, single use).

POST /v1/pairing-codes
curl -X POST -H "Authorization: Bearer $API_KEY" \
     -H "Content-Type: application/json" \
     -d '{"ap_id":"ap-YOURID"}' \
     https://app.quantumhproxy.com/v1/pairing-codes

Response: {"code":"123456","ap_id":"ap-YOURID","expires_at":1700000000,"relay_url":"wss://..."}

iProxy-compatible equivalent — the id goes in the URL and no body is needed:

POST /api/console/v1/connection/{id}/pin-code
curl -X POST -H "Authorization: Bearer $API_KEY" \
     https://app.quantumhproxy.com/api/console/v1/connection/ap-YOURID/pin-code

Response: {"pincode":"123456","expires_at":"...","relay_url":"wss://..."}

Then on the new phone: open the QuantumProxy Android app, run the setup wizard, and enter the 6-digit pin at the Pairing step. The proxy re-binds to that phone.

Moving a live connection (maintenance, minimal downtime): generate a pin for the proxy you want to move and enter it on the replacement phone. The proxy keeps the same SOCKS5/HTTP ports, the same username & password, and the same rotation URL — your customer's connection string never changes. Downtime is only the few seconds the new phone takes to pair. Same flow for swapping failed hardware or bringing new capacity online.

Examples — Python

import requests

API_KEY = "qp_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}
BASE = "https://app.quantumhproxy.com/v1"

# List proxies
proxies = requests.get(f"{BASE}/proxies", headers=HEADERS).json()
for p in proxies:
    print(p["id"], p["label"], "online" if p["online"] else "offline", p.get("exit_ip"))

# Rotate one
requests.post(f"{BASE}/proxies/ap-ggMrblS6/rotate", headers=HEADERS)

Examples — Node.js

const API_KEY = "qp_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const BASE = "https://app.quantumhproxy.com/v1";
const headers = { Authorization: `Bearer ${API_KEY}` };

// List proxies
const proxies = await fetch(`${BASE}/proxies`, { headers }).then(r => r.json());
console.log(proxies);

// Rotate
await fetch(`${BASE}/proxies/ap-ggMrblS6/rotate`, { method: "POST", headers });

Error format

{
  "error": "machine_readable_code",
  "message": "Human readable description.",
  "request_id": "req-A2bC3dE4"
}
StatusCodeMeaning
401unauthorizedMissing or invalid API key.
401key_revokedAPI key has been revoked. Mint a new one.
403account_lockedAccount is locked. Contact operator.
404not_foundProxy does not exist or is not in your account.
400invalid_requestBody or query parameter is malformed.
429rate_limitedPer-proxy or per-key rate limit hit. Retry-After header tells you when.
500internalServer error. Quote request_id to support.

Rate limits

60 write requests (POST/PATCH) per minute per key. 600 reads per minute. Hitting the limit returns 429 with the Retry-After header.

iProxy-compatible alias surface

For partners with existing iProxy integrations: mirror routes and JSON shapes are available at /api/console/v1/*. Same auth (Bearer API key), same scoping. In most cases you can swap the iProxy base URL with https://app.quantumhproxy.com/api/console/v1 and your existing code keeps working.

iProxy pathNative equivalent
GET /connectionGET /v1/proxies
GET /connection/{id}GET /v1/proxies/{id}
GET /connection-statusGET /v1/devices
POST /connection/{id}/command-pushPOST /v1/proxies/{id}/command
GET /connection/{id}/traffic/by-dayGET /v1/proxies/{id}/usage
GET /connection/{id}/uptimeGET /v1/proxies/{id}/uptime
GET /connection/{id}/ip-historyGET /v1/proxies/{id}/ip-history
POST /connection/{id}/pin-codePOST /v1/pairing-codes

Action set on command-push: changeip is wired today. reboot, refresh, toggle_proxy, find_my_device, speed_test, upgrade_app, debug_report, fix_lte, refresh_fingerprint are recognized but return HTTP 501 ({"error":"unsupported_action"}) until the matching APK opcodes ship — your code can detect feature gaps from the error code.

Known iProxy endpoints we don't alias: SMS history (no phone-side reader), traffic-ACL rules (no enforcement engine), OpenVPN access (we're a proxy, not a VPN), plan/billing (we sell out-of-band).

Versioning

This is v1. Future versions live at /v2/, /v3/, etc. v1 endpoints will be supported for at least 12 months past any successor release.

Questions? Reach the operator who issued your key.