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

  1. Apply on the reseller program page. Tell us what you sell and roughly how much.
  2. We reply by email, Telegram or Discord, agree your pricing and open your partner account.
  3. 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

text
https://nyxonproxies.com/api/v1

The 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:

text
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:

json
{"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

MethodPathWhat it does
GET/balanceYour reseller balance
GET/balance/transactionsCredits and charges on the balance
GET/productsEverything you can sell, at your prices
POST/plans/check-pricePrice a plan without buying it
POST/plansCreate a plan for a customer
GET/plansList your plans
GET/plans/{plan_id}One plan, with credentials and limits
GET/plans/{plan_id}/usageUsage over time
GET/plans/{plan_id}/proxy-listThe individual proxies on a Dedicated ISP plan
GET/plans/{plan_id}/extend-optionsHow a plan can be extended
POST/plans/{plan_id}/extendExtend a plan
PUT/plans/{plan_id}/passwordChange a plan's proxy password
GET/proxies/connection-infoA product's gateway host, ports and targeting
GET/proxies/poolsDedicated ISP pools
GET/geo/catalogThe 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:

bash
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:

bash
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"}'
json
{
  "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

FieldUsed for
productRequired. The product id from GET /products, such as residential.
bandwidth_gbGB of traffic, for per-GB products and hybrid products billed by bandwidth.
billing_typeHybrid products only: bandwidth (per GB, the default) or time (Mbps and days).
mbpsThe speed for hybrid products billed by time.
durationThe term for time-billed and unlimited plans, such as 1_day, 7_days or 30_days.
bandwidth_mbpsThe port speed for Unlimited Residential plans.
quantityThe number of Dedicated ISP IPs.
poolThe Dedicated ISP pool id from GET /proxies/pools.
end_user_referenceYour 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:

EndpointLimit
POST /plans, POST /plans/{plan_id}/extend60 per minute
POST /plans/check-price120 per minute
PUT /plans/{plan_id}/password30 per minute
GET /plans/{plan_id}/proxy-list60 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

CodeHTTPMeaning
VALIDATION_ERROR400A parameter is missing, malformed or out of range. details lists each field.
MISSING_PARAM400The product needs a parameter you did not send, such as bandwidth_gb, pool or duration.
INVALID_PRODUCT400Unknown product id, or the product is not sold right now.
INVALID_IDEMPOTENCY_KEY400The idempotency key is not 8 to 64 letters, digits, - or _.
EXTENSION_NOT_SUPPORTED400This plan cannot be extended. Buy a new plan instead.
PLAN_NOT_ACTIVE400The plan has expired or is not active.
EXTENSION_FAILED400, 502The extension was refused. Your balance was not charged.
UPDATE_FAILED400, 502The password change was refused. Try again or use a different password.
UNAUTHORIZED401Missing, invalid or revoked API key.
INSUFFICIENT_BALANCE402Your balance does not cover the price. Top up in the portal.
ACCOUNT_NOT_ACTIVE403Your reseller account is suspended or no longer a reseller account.
FORBIDDEN403This credential cannot be used here.
PLAN_NOT_FOUND404No plan with this id belongs to your account.
NOT_FOUND404Unknown endpoint.
OUT_OF_STOCK409The product or pool is out of stock right now.
PRICE_UNAVAILABLE409The product cannot be sold at your price at the moment. Contact support.
IDEMPOTENCY_KEY_CONFLICT409The key was already used with a different body.
IDEMPOTENT_INFLIGHT409A request with this key is still running. Retry shortly with the same key.
CONFLICT409The request conflicts with the plan's current state.
PLAN_NOT_READY409The plan is still being set up. Retry in a minute.
RATE_LIMITED429Too many requests. Slow down and retry.
INTERNAL_ERROR500, 502Unexpected error. Retry, and contact support if it persists.
PROVISIONING_FAILED502The plan could not be created. Your balance was not charged.
UPSTREAM_UNAVAILABLE502The 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 with GET /plans.
  • Call check-price before showing a price to your customer, because prices can change.
  • Retry 5xx and 429 answers 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.