Reseller API documentation
The CleanProxies Reseller API v1 is a REST API to buy, deliver and manage ISP proxies (as low as $0.75/IP), rotating residential and mobile proxies, VPS and bare-metal servers from your own code, paid from your account balance.
Quick start
https://www.cleanproxies.com/api/v1. Every request is JSON over HTTPS, authenticated with an API key.- 1
Open a reseller account
Create a CleanProxies account and add a $500 opening balance. It unlocks reseller pricing and API keys, and every API order is paid from it. - 2
Create an API key
In the dashboard, open Reseller Program > Settings and create a key. It starts with cp_live_ and is shown once; keep it on your server. - 3
Make your first call
curl1curl "https://www.cleanproxies.com/api/v1/account" \2 -H "Authorization: Bearer $CLEANPROXIES_API_KEY" - 4
Quote, order and fetch your proxies
POST /v1/quote checks price and stock, POST /v1/orders places the order, and GET /v1/orders/{id}?wait=25 returns the connection details once it is active.curl1curl -X POST "https://www.cleanproxies.com/api/v1/orders" \2 -H "Authorization: Bearer $CLEANPROXIES_API_KEY" \3 -H "Content-Type: application/json" \4 -H "Idempotency-Key: $(uuidgen)" \5 -d '{"product":"isp","quantity":10000,"provider":"frontier","autoRenew":true}'
- Bodies are JSON (Content-Type: application/json, at most 16 KB). Unknown fields are rejected, so typos fail loudly.
- Money is in integer US cents (balanceCents: 1250000 is $12,500.00) and times are ISO 8601 in UTC.
- A success response is the resource itself; lists are { data, hasMore, nextCursor } (pass nextCursor as cursor).
- Every response carries an X-Request-Id header; include it when you contact support.
- New orders go paid, then provisioning, then active (or failed, refunded to your balance automatically). Monthly orders run 30 days; GB never expire.
Authentication
Send your API key in the Authorization header as a Bearer token on every request (the x-api-key header is accepted too). Keys are stored as a hash, can be renamed, reset and revoked in the dashboard, and stop working within 10 seconds of being revoked. The API does not allow calls from browsers (no CORS): a key can spend your balance, so keep it on your server.
Products you can order
| Product | Order fields | Billing | Price |
|---|---|---|---|
isp | quantity (5-10,000), provider | Monthly, per IP | as low as $0.75/IP |
isp-subnet | quantity (255, 510 or 1020), provider | Monthly, per IP | from $1.19/IP |
rotating-residential | gb (5+) | One-time, per GB, never expires | as low as $0.63/GB |
mobile | gb (5+) | One-time, per GB, never expires | as low as $0.79/GB |
vps | configId, osId | Monthly, per server | from $24/month |
bare-metal | configId, osId | Monthly, per server | from $125/month |
Account and catalog
- GET
/v1/accountGet account - GET
/v1/productsList products - GET
/v1/locationsList proxy locations - POST
/v1/quoteGet a quote
Get account
120/minYour account balance (what orders are paid from), the API key making the call, and your rate limits.
List products
120/minThe live catalog: retail price tiers, ISP providers with availability, gateway hosts, and VPS / bare-metal configurations with their OS ids. API orders are charged reseller prices (resellerPricing): your whole volume sets the tier, not the order size. Volume is your active IPs on isp / isp-subnet, or the GB you bought in the last 30 days on rotating-residential / mobile, plus the order itself; every order is charged the tier your volume reaches, and never more than retail for that order. customUnitPriceCents, when set, is a price agreed for your account.
List proxy locations
30/minCountries, and for one country its regions, cities and ASNs, for generating rotating residential or mobile proxies. Region and city targeting are rotating residential only.
| Parameter | In | Type | Description |
|---|---|---|---|
product | query | string | rotating-residential (default) or mobile |
country | query | string | ISO 3166 alpha-2 code; adds regions, cities and ASNs |
Get a quote
60/minThe server price for a product and configuration, whether it is in stock, and whether your balance covers it. Takes the same product fields as Create an order.
| Parameter | In | Type | Description |
|---|---|---|---|
product * | body | string | isp, isp-subnet, rotating-residential, mobile, vps or bare-metal |
quantity | body | integer | isp / isp-subnet: number of IPs (isp-subnet: 255, 510 or 1020) |
provider | body | string | isp / isp-subnet: provider key from List products (default: the catalog default) |
gb | body | integer | rotating-residential / mobile: GB |
configId, osId | body | string | vps / bare-metal: configuration and OS ids |
Orders
- POST
/v1/ordersCreate an order - GET
/v1/ordersList orders - GET
/v1/orders/{id}Get an order - POST
/v1/orders/{id}/renewRenew an order - POST
/v1/orders/{id}/topupTop up GB - POST
/v1/orders/{id}/auto-renewSet auto-renew
Create an order
Idempotency-Key required20/minPlaces an order paid in full from your account balance; no card step. Answers 402 INSUFFICIENT_BALANCE (with shortfallCents) when the balance doesn't cover the whole price. The order starts as paid and becomes active once it is set up (seconds for rotating/mobile, up to a few minutes for ISP and servers): poll Get an order with ?wait=25. Monthly products last 30 days; renew them or set autoRenew.
| Parameter | In | Type | Description |
|---|---|---|---|
product * | body | string | isp, isp-subnet, rotating-residential, mobile, vps or bare-metal |
quantity | body | integer | isp / isp-subnet: number of IPs (isp: 5-10,000; isp-subnet: 255, 510 or 1020) |
provider | body | string | isp / isp-subnet: provider key (frontier, atnt, comcast, cox, rcn, tmobile, verizon, telus, ...) |
gb | body | integer | rotating-residential / mobile: GB (minimum 5) |
configId | body | string | vps / bare-metal: configuration id from List products |
osId | body | string | vps / bare-metal: operating system id |
autoRenew | body | boolean | Monthly products: renew from your balance 24 h before expiry |
customer | body | string | Your customer label (a-z, 0-9, _ and -); created if new |
reference | body | string | Your own reference, up to 100 characters |
List orders
120/minYour orders, newest first (dashboard and API orders alike; balance deposits are not listed). Pass nextCursor as cursor for the next page. Connection details are only on Get an order.
| Parameter | In | Type | Description |
|---|---|---|---|
limit | query | integer | 1-100, default 25 |
cursor | query | string | nextCursor from the previous page |
product | query | string | Only this product (also trial) |
status | query | string | pending_payment, paid, provisioning, active, failed, abandoned, expired, cancelled or refunded |
customer | query | string | Only orders tagged with this customer |
Get an order
120/minOne order with its connection details in `service` once it is active: ISP username/password (the IP list is at /proxies), the rotating/mobile gateway and password, or the server IP and login. `wait` long-polls up to that many seconds until the order is active or has ended.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Order id |
wait | query | integer | 0-25 seconds to wait for the order to become active |
Renew an order
Idempotency-Key required20/minAdds one 30-day period to an active monthly order (isp, isp-subnet, vps, bare-metal) at your current reseller price, paid from your balance. Allowed until 24 hours after expiry. Orders billed by a card subscription renew by themselves.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Order id |
Top up GB
Idempotency-Key required20/minAdds GB to an active rotating residential or mobile order. The credentials stay the same. Priced at your reseller GB price (your GB bought in the last 30 days plus this top-up sets the tier); minimum 5 GB.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Order id |
gb * | body | integer | GB to add |
Set auto-renew
20/minTurns automatic renewal from your balance on or off for a monthly order. Turning it off is how you cancel: the order then ends at expiresAt.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Order id |
enabled * | body | boolean | true or false |
Proxies
- GET
/v1/orders/{id}/proxiesGet proxies - POST
/v1/orders/{id}/authSet ISP authentication - GET
/v1/orders/{id}/usageGet usage
Get proxies
30/minISP / ISP subnet orders: the IP list, as ip:port:username:password (or ip:port under IP authentication). Rotating residential / mobile orders: generated proxy lines for the targeting you ask for; sticky sessions keep the same IP for ttl minutes.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Order id |
country | query | string | Rotating/mobile: ISO alpha-2 code, or global (default) |
region, city | query | string | Rotating residential: codes from List proxy locations (need country) |
asn | query | string | Rotating/mobile: ASN such as 7922 (needs country; not with region/city) |
session | query | string | rotating (default) or sticky |
ttl | query | integer | Sticky session minutes, 1-1440 |
count | query | integer | Lines to generate, 1-1000 (default 10) |
format | query | string | host:port:user:pass (default), user:pass@host:port or user:pass:host:port |
Set ISP authentication
30/minSwitches an ISP / ISP subnet order between username/password authentication and an IP whitelist of 1-20 IPv4 addresses.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Order id |
authType * | body | string | user or ip |
ips | body | string[] | authType ip: 1-20 IPv4 addresses |
Get usage
30/minGB bought, used and left on a rotating residential or mobile order, with daily usage for the last 30 days (UTC).
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Order id |
Servers
- GET
/v1/orders/{id}/serverGet server state - POST
/v1/orders/{id}/powerPower control - POST
/v1/orders/{id}/reinstallReinstall OS
Get server state
30/minLive power state of a VPS or bare-metal server: running, stopped, stopping, starting, pending, error, terminated or unknown.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Order id |
Power control
30/minStarts, stops or reboots a server. One action per server every 30 seconds (429 ACTION_COOLDOWN otherwise).
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Order id |
action * | body | string | start, stop or reboot |
Reinstall OS
30/minReinstalls a bare-metal server with an OS from its configuration's list and answers the new login. Erases the disks. At most once every 10 minutes.
| Parameter | In | Type | Description |
|---|---|---|---|
id * | path | string | Order id |
osId * | body | string | OS id from List products |
Customers (sub-users)
- POST
/v1/usersCreate a customer - GET
/v1/usersList customers - GET
/v1/users/{username}Get a customer - DELETE
/v1/users/{username}Delete a customer
Create a customer
20/minCreates a customer label (201), or answers the existing one (200). Orders created with this customer are listed under it.
| Parameter | In | Type | Description |
|---|---|---|---|
username * | body | string | 1-64 characters: a-z, 0-9, _ and - |
note | body | string | Up to 200 characters |
List customers
120/minYour customer labels in alphabetical order.
| Parameter | In | Type | Description |
|---|---|---|---|
limit | query | integer | 1-100, default 50 |
cursor | query | string | nextCursor from the previous page |
Get a customer
120/minA customer with its latest 100 orders and totals: active orders, active ISP IPs, GB bought on active rotating/mobile orders, and active servers.
| Parameter | In | Type | Description |
|---|---|---|---|
username * | path | string | Customer label |
Delete a customer
20/minDeletes the label. Refused (409 CUSTOMER_HAS_ACTIVE_ORDERS) while the customer has pending or active orders. Orders themselves are never changed.
| Parameter | In | Type | Description |
|---|---|---|---|
username * | path | string | Customer label |
Errors
| Code | Status | Meaning |
|---|---|---|
UNAUTHENTICATED | 401 | Missing, malformed or unknown API key. |
KEY_REVOKED | 401 | The key was revoked or rotated. |
ACCOUNT_BLOCKED | 403 | The account is blocked or disabled. |
VALIDATION_ERROR | 400 | A field is missing, has the wrong type, or is unknown (see field). |
INVALID_JSON / UNSUPPORTED_MEDIA_TYPE | 400 | The body isn't a JSON object sent as application/json (415). |
INVALID_QUANTITY, BELOW_MINIMUM, INVALID_PROVIDER, INVALID_CONFIG_ID, INVALID_OS | 400 | The catalog rejected the configuration. |
NOT_SUPPORTED | 400 | The action doesn't apply to this product (501 for VPS reinstall). |
INSUFFICIENT_BALANCE | 402 | The balance doesn't cover the whole price. requiredCents, balanceCents and shortfallCents tell you how much to add. |
NOT_FOUND | 404 | No such order, customer or endpoint on your account. |
SOLD_OUT | 409 | Out of stock right now. |
NOT_RENEWABLE, NOT_TOPUPABLE, SUBSCRIPTION_MANAGED, ORDER_NOT_ACTIVE | 409 | The order is not in a state that allows this (some are 400). |
REQUEST_IN_PROGRESS | 409 | Another money request on your account, or the same Idempotency-Key, is still running. Retry after Retry-After. |
IDEMPOTENCY_KEY_REQUIRED / IDEMPOTENCY_KEY_INVALID | 400 | Send an Idempotency-Key on this POST. |
IDEMPOTENCY_MISMATCH | 422 | The Idempotency-Key was used for a different request. |
RATE_LIMITED, ACTION_COOLDOWN | 429 | Too many requests. Wait for Retry-After seconds. |
OUTCOME_UNKNOWN | 503 | No answer in time. Retry with the same Idempotency-Key: you get the result, never a second charge. |
UPSTREAM_UNAVAILABLE, STOCK_UNAVAILABLE | 503 | A provider is briefly unavailable. Retry shortly. |
INTERNAL | 500 | Our error. Retry, and send us the requestId if it persists. |
Rate limits and idempotency
Limits apply per API key, per minute. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (seconds); a 429 also carries Retry-After. Order, renewal and top-up requests run one at a time per account; a second one waits up to 10 seconds, then gets 409 REQUEST_IN_PROGRESS.
| Class | Requests per minute | Endpoints |
|---|---|---|
| read | 120 | GET account, products, orders, users |
| quote | 60 | POST quote |
| write | 20 | POST orders, renew, topup, auto-renew, users; DELETE users |
| action | 30 | locations, proxies, auth, usage, server, power, reinstall |
Send an Idempotency-Key header (1-100 letters, digits, - and _; a UUID is ideal) to make a POST safe to retry. It is required on create order, renew and top-up. For 24 hours, retrying with the same key returns the original response with Idempotent-Replayed: true instead of charging again; reusing a key for a different request returns 422. After a 503 OUTCOME_UNKNOWN, retry with the same key: you get the order that was placed, or it is placed once.
OpenAPI specification
The full API is described in OpenAPI 3.1 at https://www.cleanproxies.com/openapi.json. Import it into Postman, Insomnia or Swagger UI, generate a client in your language, or hand it to an AI agent as a tool definition. Questions? Email help@cleanproxies.com, 24/7.
Reseller API FAQs
Yes. The CleanProxies Reseller API v1 is a REST API at https://www.cleanproxies.com/api/v1 that buys, delivers and manages ISP proxies, ISP subnets, rotating residential and mobile proxies, VPS and bare-metal servers from your own code. Orders are paid from your account balance and delivered instantly.