API for developers

Manage your plans from your own scripts and services: check remaining traffic, get proxy lines, whitelist IP addresses and buy more gigabytes from your balance without opening the dashboard.

Quick start

Create a key in the dashboard: Settings → API. The full key is shown only once, so save it right away in a password manager or an environment variable. Up to 5 keys per account; revoke a key you no longer need in the same place.

All URLs start with https://prokso.com/api/v1. Responses are JSON, money is in US dollar cents, traffic is in bytes and GB, and times are UTC in ISO 8601.

curl https://prokso.com/api/v1/me \
  -H "Authorization: Bearer $PROKSO_KEY"

Authentication

Send the key in the Authorization: Bearer <key> header or in X-API-Key. Your browser dashboard session does not work for the API. Requests from a blocked or deleted account and with a revoked key get a 401 response.

Limits

  • Up to 60 requests per minute per key. Beyond that you get 429 and a Retry-After header with the number of seconds to wait.
  • Up to 20 failed authentication attempts per 10 minutes from one IP address (a /64 network for IPv6), then 429.
  • At most 1,000 proxy lines per request and 5 IP addresses in a plan whitelist.

Errors

Errors always come in the same format with a matching HTTP status:

{"error": {"code": "insufficient_balance", "message": "Not enough money on the balance. Top it up in the dashboard."}}
HTTPcodeMeaning
400validation_error, invalid_json, below_minimum_orderInvalid parameters, or the order does not meet the conditions from GET /api/v1/prices.
401unauthorizedNo key, wrong key or revoked key.
402insufficient_balanceNot enough money on the balance. Nothing was charged.
404not_foundThe plan or order does not exist or belongs to another account.
409 / 422idempotency_in_progress, idempotency_key_reusedA request with this Idempotency-Key is still running, or the key was used with different data.
429rate_limitedRate limit exceeded: wait as many seconds as Retry-After says.
503service_unavailableThe proxy network is temporarily not responding: retry in a minute.

Purchases without duplicates

Purchases through the API are paid only from your balance (top it up in the dashboard). To make sure a retry after a dropped connection does not buy gigabytes twice, add an Idempotency-Key header with any unique string of up to 100 characters. For 24 hours a repeated request with the same key returns the first order (with the Idempotent-Replayed: true header) instead of creating a new one. If a request is rejected (for example, not enough money), the key can be used again.

Endpoints

GET /api/v1/me

Account email and balance.

curl https://prokso.com/api/v1/me \
  -H "Authorization: Bearer $PROKSO_KEY"
{
  "email": "you@example.com",
  "balance_cents": 4250,
  "balance": "$42.50",
  "currency": "USD"
}

GET /api/v1/prices

Prices per 1 GB and single-order conditions for each proxy type, the same as in the dashboard.

curl https://prokso.com/api/v1/prices -H "Authorization: Bearer $PROKSO_KEY"
{
  "currency": "USD",
  "max_gb_per_order": 5000,
  "pools": {
    "residential": {
      "tiers": [
        {
          "from_gb": 1,
          "price_per_gb_cents": 159,
          "price_per_gb": "$1.59"
        }
      ],
      "min_order_cents": 100,
      "min_order": "$1.00",
      "min_gb": 1
    },
    "mobile": {...},
    "datacenter": {...}
  }
}

GET /api/v1/plans

All plans: type, status (active, paused, limited), login, GB bought and traffic left.

curl https://prokso.com/api/v1/plans -H "Authorization: Bearer $PROKSO_KEY"
{
  "plans": [{
    "id": 17, "label": "Instagram UA", "pool": "residential",
    "status": "active", "paused": false, "login": "a1b2c3d4", "gb_bought": 10,
    "traffic": {"left_bytes": 8053063680, "used_bytes": 2684354560, "total_bytes": 10737418240,
                "left_gb": 7.5, "used_gb": 2.5, "total_gb": 10.0},
    "created_at": "2026-10-05T09:12:44Z"
  }]
}

GET /api/v1/plans/{id}

One plan: host, ports, login and password, IP whitelist, pool settings.

curl https://prokso.com/api/v1/plans/17 -H "Authorization: Bearer $PROKSO_KEY"
{
  "id": 17, "label": "Instagram UA", "pool": "residential", "status": "active", ...,
  "host": "gw.prokso.com", "login": "a1b2c3d4", "password": "********",
  "ports": {"http_rotating": 823, "socks5_rotating": 824, "sticky_from": 10000, "sticky_to": 20000},
  "ip_whitelist": ["203.0.113.7"], "ip_whitelist_max": 5,
  "pool_settings": {"countries": [], "exclude_countries": [], "exclude_asn": [], "anonymous_filter": false,
                    "rotation_interval_minutes": null, "blocked_hosts": [], "traffic_limit": null}
}

POST /api/v1/plans

A new plan paid from your balance. pool is residential, mobile or datacenter; gb is an integer; label and promo are optional.

curl -X POST https://prokso.com/api/v1/plans \
  -H "Authorization: Bearer $PROKSO_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f1c2a90-order-1" \
  -d '{"pool": "residential", "gb": 10, "label": "Instagram UA"}'
201 Created
{
  "order": {"id": 311, "kind": "new", "status": "fulfilled", "pool": "residential", "gb": 10,
            "plan_id": 18, "amount_cents": 1590, "amount": "$15.90", ...},
  "plan": {"id": 18, "login": "e5f6a7b8", ...},
  "balance_cents": 2350, "balance": "$23.50"
}

POST /api/v1/plans/{id}/topup

Add GB to an existing plan from your balance. Same rules as for a new plan.

curl -X POST https://prokso.com/api/v1/plans/17/topup \
  -H "Authorization: Bearer $PROKSO_KEY" \
  -H "Idempotency-Key: 6f1c2a90-topup-1" \
  -d '{"gb": 50}'
201 Created
{"order": {"id": 312, "kind": "topup", "status": "fulfilled", "gb": 50, ...}, "plan": {...}, ...}

GET /api/v1/plans/{id}/proxies

Proxy lines for a plan, as JSON or plain text.

Add the Accept: text/plain header to get plain text, one proxy per line.

curl "https://prokso.com/api/v1/plans/17/proxies?country=ua&count=3&protocol=http&session=sticky" \
  -H "Authorization: Bearer $PROKSO_KEY"
{
  "lines": [
    "a1b2c3d4__cr.ua:********@gw.prokso.com:10000",
    "a1b2c3d4__cr.ua:********@gw.prokso.com:10001",
    "a1b2c3d4__cr.ua:********@gw.prokso.com:10002"
  ],
  "count": 3,
  "precise_geo": false
}

GET /api/v1/plans/{id}/whitelist
POST /api/v1/plans/{id}/whitelist
DELETE /api/v1/plans/{id}/whitelist?ip=…

Plan IP whitelist: list, add (POST with an ip field) and remove (DELETE with an ip parameter).

curl -X POST https://prokso.com/api/v1/plans/17/whitelist \
  -H "Authorization: Bearer $PROKSO_KEY" \
  -d '{"ip": "203.0.113.7"}'
{"ips": ["203.0.113.7"], "max": 5}

POST /api/v1/plans/{id}/pause
POST /api/v1/plans/{id}/resume

Pause a plan (proxies stop working, no traffic is used) or resume it.

curl -X POST https://prokso.com/api/v1/plans/17/pause -H "Authorization: Bearer $PROKSO_KEY"
{"id": 17, "status": "paused", "paused": true, ...}

PATCH /api/v1/plans/{id}

Rename a plan (label, up to 60 characters).

curl -X PATCH https://prokso.com/api/v1/plans/17 \
  -H "Authorization: Bearer $PROKSO_KEY" \
  -d '{"label": "Ads Poland"}'
{"id": 17, "label": "Ads Poland", ...}

GET /api/v1/orders
GET /api/v1/orders/{id}

Recent account orders (limit up to 100) and a single order by ID.

curl "https://prokso.com/api/v1/orders?limit=20" -H "Authorization: Bearer $PROKSO_KEY"
{"orders": [{"id": 312, "kind": "topup", "status": "fulfilled", "gb": 50, "amount": "$79.50", ...}]}

Proxy generator parameters

The same rules as the generator in the dashboard (advanced mode). Precise geo (state, city, ZIP, provider) uses traffic at double rate.

ParameterValue
countryCountry code (ua) or up to 10 comma-separated codes; empty means any country.
countNumber of lines, 1 to 1,000 (default 10). For session=rotating one line is enough.
protocolhttp or socks5.
sessionsticky: a separate port 10000 to 20000 per line keeping the same IP; rotating: a new IP for every request (port 823 HTTP, 824 SOCKS5); session: the rotating port with a session ID in the login.
formatlp@hp, hp:lp, url, hp@lp, lp:hp or hp (host and port only, for IP-based access).
start_portFirst port for sticky, 10000 to 20000.
state, city, zip, asnPrecise geo and provider (ASN) for a single country; state is US only.
exclude_state, exclude_city, exclude_zipExclude states, cities or ZIP codes.
session_prefixPrefix for session IDs in session mode, Latin letters and digits.