Reseller API
Sell NyxonProxies plans under your own brand with the Reseller API. Authentication, responses, idempotent purchases, rate limits, endpoints and error codes.
The Reseller API lets partners price, buy, extend and monitor NyxonProxies plans for their own customers from code. Every plan is charged to your reseller balance at your partner rate, and everything your customers see is white-label: hosts, plans and errors carry no other provider's name.
Get access
- Apply on the reseller program page. Tell us what you sell and roughly how much.
- We reply by email, Telegram or Discord, agree your pricing and open your partner account.
- Sign in to the reseller portal, top up the reseller balance in crypto and create an API key.
The portal also lets you buy and manage plans by hand and see every transaction. The full API reference, with code samples in cURL, Python and Node.js and example responses, is open to everyone, so you can read it before you apply.
Base URL
https://nyxonproxies.com/api/v1The machine-readable OpenAPI specification describes every endpoint, parameter and response. Import it into Postman, Insomnia or a code generator.
Authentication
Create a key on the API keys page of the portal and send it with every request:
Authorization: Bearer nyx_live_...Keys start with nyx_live_ and act for your reseller account only.
Responses
Every response, success or error, uses the same envelope:
{"success": true, "data": {"balance_cents": 24209, "currency": "USD"}}
{"success": false, "error": {"code": "INSUFFICIENT_BALANCE", "message": "This plan costs $4.00; your balance is $1.20."}}Branch on error.code. The message is meant for people. Amounts are integers in US cents (fields ending in _cents), and times are ISO 8601 in UTC.
Endpoints
| Method | Path | What it does |
|---|---|---|
GET | /balance | Your reseller balance |
GET | /balance/transactions | Credits and charges on the balance |
GET | /products | Everything you can sell, at your prices |
POST | /plans/check-price | Price a plan without buying it |
POST | /plans | Create a plan for a customer |
GET | /plans | List your plans |
GET | /plans/{plan_id} | One plan, with credentials and limits |
GET | /plans/{plan_id}/usage | Usage over time |
GET | /plans/{plan_id}/proxy-list | The individual proxies on a Dedicated ISP plan |
GET | /plans/{plan_id}/extend-options | How a plan can be extended |
POST | /plans/{plan_id}/extend | Extend a plan |
PUT | /plans/{plan_id}/password | Change a plan's proxy password |
GET | /proxies/connection-info | A product's gateway host, ports and targeting |
GET | /proxies/pools | Dedicated ISP pools |
GET | /geo/catalog | The targeting catalog for a product |
Price and buy a plan
POST /plans/check-price takes the same body as POST /plans and returns exactly what the purchase would cost:
curl https://nyxonproxies.com/api/v1/plans/check-price \
-H "Authorization: Bearer $NYX_KEY" \
-H "Content-Type: application/json" \
-d '{"product": "residential", "bandwidth_gb": 4}'Then create the plan. The price is charged to your balance and the response holds the plan with its credentials:
curl https://nyxonproxies.com/api/v1/plans \
-H "Authorization: Bearer $NYX_KEY" \
-H "Content-Type: application/json" \
-H "X-Idempotency-Key: order-10042" \
-d '{"product": "residential", "bandwidth_gb": 4, "end_user_reference": "cust-42"}'{
"success": true,
"data": {
"plan_id": "3f2c9a1e-7b4d-4c1a-9e2f-5d8b6a0c1e47",
"product": "residential",
"status": "active",
"end_user_reference": "cust-42",
"proxy_username": "u3b180e0",
"proxy_password": "p950ea5c",
"connection": {
"hostname": "geo.gw.nyxon.sh",
"port_http": 8080,
"port_socks": 1080,
"format": "u3b180e0:[email protected]:8080"
},
"limits": {"max_gb": 4, "max_bytes": 4000000000, "bytes_used": 1288490188},
"expires_at": "2027-10-09T12:00:00Z",
"created_at": "2026-10-09T12:00:00Z",
"cost_cents": 400
}
}Hand the username, password and connection to your customer. They use them exactly as described in these docs, with the same username parameters for targeting and sessions.
Request body
| Field | Used for |
|---|---|
product | Required. The product id from GET /products, such as residential. |
bandwidth_gb | GB of traffic, for per-GB products and hybrid products billed by bandwidth. |
billing_type | Hybrid products only: bandwidth (per GB, the default) or time (Mbps and days). |
mbps | The speed for hybrid products billed by time. |
duration | The term for time-billed and unlimited plans, such as 1_day, 7_days or 30_days. |
bandwidth_mbps | The port speed for Unlimited Residential plans. |
quantity | The number of Dedicated ISP IPs. |
pool | The Dedicated ISP pool id from GET /proxies/pools. |
end_user_reference | Your own customer or order id. Stored on the plan, and GET /plans can filter by it. |
The allowed values for each product, such as the durations and speeds, are in its config in GET /products.
Idempotency
POST /plans and POST /plans/{plan_id}/extend accept an X-Idempotency-Key header of 8 to 64 letters, digits, - or _. Retrying with the same key returns the original response and never charges twice. Reusing a key with a different body is refused with IDEMPOTENCY_KEY_CONFLICT. Use one key per purchase, such as your order id.
Rate limits
Limits apply per client IP:
| Endpoint | Limit |
|---|---|
POST /plans, POST /plans/{plan_id}/extend | 60 per minute |
POST /plans/check-price | 120 per minute |
PUT /plans/{plan_id}/password | 30 per minute |
GET /plans/{plan_id}/proxy-list | 60 per minute |
Other read endpoints are not limited, but poll a plan at most once a minute: usage updates every one to four minutes. Over a limit you get 429 RATE_LIMITED.
Error codes
| Code | HTTP | Meaning |
|---|---|---|
VALIDATION_ERROR | 400 | A parameter is missing, malformed or out of range. details lists each field. |
MISSING_PARAM | 400 | The product needs a parameter you did not send, such as bandwidth_gb, pool or duration. |
INVALID_PRODUCT | 400 | Unknown product id, or the product is not sold right now. |
INVALID_IDEMPOTENCY_KEY | 400 | The idempotency key is not 8 to 64 letters, digits, - or _. |
EXTENSION_NOT_SUPPORTED | 400 | This plan cannot be extended. Buy a new plan instead. |
PLAN_NOT_ACTIVE | 400 | The plan has expired or is not active. |
EXTENSION_FAILED | 400, 502 | The extension was refused. Your balance was not charged. |
UPDATE_FAILED | 400, 502 | The password change was refused. Try again or use a different password. |
UNAUTHORIZED | 401 | Missing, invalid or revoked API key. |
INSUFFICIENT_BALANCE | 402 | Your balance does not cover the price. Top up in the portal. |
ACCOUNT_NOT_ACTIVE | 403 | Your reseller account is suspended or no longer a reseller account. |
FORBIDDEN | 403 | This credential cannot be used here. |
PLAN_NOT_FOUND | 404 | No plan with this id belongs to your account. |
NOT_FOUND | 404 | Unknown endpoint. |
OUT_OF_STOCK | 409 | The product or pool is out of stock right now. |
PRICE_UNAVAILABLE | 409 | The product cannot be sold at your price at the moment. Contact support. |
IDEMPOTENCY_KEY_CONFLICT | 409 | The key was already used with a different body. |
IDEMPOTENT_INFLIGHT | 409 | A request with this key is still running. Retry shortly with the same key. |
CONFLICT | 409 | The request conflicts with the plan's current state. |
PLAN_NOT_READY | 409 | The plan is still being set up. Retry in a minute. |
RATE_LIMITED | 429 | Too many requests. Slow down and retry. |
INTERNAL_ERROR | 500, 502 | Unexpected error. Retry, and contact support if it persists. |
PROVISIONING_FAILED | 502 | The plan could not be created. Your balance was not charged. |
UPSTREAM_UNAVAILABLE | 502 | The proxy network is briefly unreachable. Retry in a minute with the same idempotency key. |
Tips
- Always send
end_user_reference, so you can find every plan of a customer withGET /plans. - Call
check-pricebefore showing a price to your customer, because prices can change. - Retry
5xxand429answers with the same idempotency key, and never without one.
Last updated
Still stuck?
People answer the live chat around the clock. Send the proxy line you used (without the password) and the error you see.