Order

A list of all publicly available methods for interacting with the API.

POST

Create an order

New/order/create
Replaces older v2 methods

This API v3 method replaces these API v2 methods (they still work):

Create an order (draft)

Prices a selection on the server and keeps it as a draft for 30 minutes. No money moves, and no token is needed.

{"action": "new", "product": "shared",
 "options": {"count": 10, "period": "1m", "traffic": 100, "countries": {"UA": 5, "DE": 5}},
 "client": {"total": "9.00", "currency": "USD"}}

Notes

  • action: new buys a product, topup adds balance (options: {amount, currency}).
  • options use the catalog's keys: count, period (1w, 2w, 1m, 1y), traffic (GB), countries, geo_service, ip_score, unlimited_ips.
  • Send client.total with the price you computed: client_check.matched says whether it equals the server price.
  • An option outside its range is 422 option_out_of_range with the allowed range.

Query method

POSThttps://api.stableproxy.com/v3/order/create

Query parameters

IdentifierRegulationsExample
actionrequiredstringnew
productNot necessarilynullablestringshared
optionsNot necessarilynullablearray[]
clientNot necessarilynullablearray[]
client.totalNot necessarilyrequired_with:clientnumeric0
client.currencyNot necessarilynullablestringsize:3"USD"
client.catalog_versionNot necessarilynullablestring0

Code examples

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/order/create", {
3 method: "POST",
4 headers: {
5 "Content-Type": "application/json"
6 },
7 body: JSON.stringify({
8 "action": "new",
9 "product": "shared",
10 "options": "[]",
11 "client": "[]",
12 "client.total": "0",
13 "client.currency": "\"USD\"",
14 "client.catalog_version": 0
15 })
16});
17const data = await response.json();

Examples of answers

Draft201application/json
{
  "data": {
    "order": {
      "id": "990dd34a-0165-4641-ab9d-94bea1007fe0",
      "action": "new",
      "product": "shared",
      "status": "draft",
      "expires_at": "2026-10-06T15:46:32Z",
      "options": {
        "count": 10,
        "period": "1m",
        "traffic": 100,
        "countries": [],
        "geo_service": "overall",
        "ip_score": 0,
        "unlimited_ips": false
      },
      "price": {
        "currency": "USD",
        "total": "1.96",
        "total_usd": "1.96",
        "lines": [
          {
            "key": "ips",
            "amount_usd": "0.80"
          },
          {
            "key": "traffic",
            "amount_usd": "1.00"
          }
        ],
        "unit": {
          "ip": "0.08",
          "one_gb": null
        },
        "adjustments": [
          {
            "key": "sale",
            "amount": "0.00"
          }
        ]
      },
      "client_check": {
        "matched": false,
        "client_total": "1.20",
        "difference": "0.76",
        "catalog_stale": true
      }
    }
  },
  "meta": []
}
Option out of range422application/json
{
  "error": {
    "code": "option_out_of_range",
    "message": "An option is outside the allowed range.",
    "details": {
      "count": {
        "min": 1,
        "max": 2000
      }
    }
  }
}
POST

Confirm and pay an order

New/order/confirm/{id}
Replaces older v2 methods

This API v3 method replaces these API v2 methods (they still work):

Confirm and pay

Pays a draft from the balance, or hands the payment to the user's browser.

Notes

  • Send an Idempotency-Key header (one unique string per purchase). Repeating it returns the first answer; using it for another order is 409.

  • 200 paid — bought from the balance; package_id is the new package.

  • 202 awaiting_payment — the balance is short: send the user to checkout.url.

  • 202 awaiting_approval — a purchase made by an app (OAuth) waits for the user: show them approval.url. Apps the user allowed to buy automatically skip this within their daily limit.

  • Then follow it with Get an order or Wait for an order.

  • Needs a token with cart.purchase (topup.upload for a top-up).

"data": {

"id": "990dd34a-0165-4641-ab9d-94bea1007fe0",

"status": "paid",

"package_id": 14800

},

"meta": {}

}

"data": {

"id": "990dd34a-0165-4641-ab9d-94bea1007fe0",

"status": "awaiting_payment",

"checkout": {

"url": "https://app.stableproxy.com/pay/990dd34a-0165-4641-ab9d-94bea1007fe0",

"due": "7.80",

"currency": "USD",

"expires_at": "2026-10-06T16:16:32Z"

}

},

"meta": {}

}

"data": {

"id": "990dd34a-0165-4641-ab9d-94bea1007fe0",

"status": "awaiting_approval",

"approval": {

"url": "https://app.stableproxy.com/order/approve/990dd34a-0165-4641-ab9d-94bea1007fe0?t=Xk2…",

"reason": "confirmation_required",

"expires_at": "2026-10-06T16:16:32Z",

"limit": null,

"spent_today": "0.00",

"order_total": "9.00",

"currency": "USD"

}

},

"meta": {}

}

"error": {

"code": "idempotency_key_required",

"message": "Send an Idempotency-Key header.",

"details": {}

}

}

This method requires authorization!
You can use your own API key, which can be obtained at control panel.

Query method

POSThttps://api.stableproxy.com/v3/order/confirm/{id}

Query parameters

IdentifierRegulationsExample
pay_withNot necessarilynullablestringbalance
id1requiredstring990dd34a-0165-4641-ab9d-94bea1007fe0

Code examples

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/order/confirm/{id}", {
3 method: "POST",
4 headers: {
5 "Authorization": "Bearer [YOUR TOKEN]",
6 "Idempotency-Key": "[A UNIQUE KEY PER PURCHASE]",
7 "Content-Type": "application/json"
8 },
9 body: JSON.stringify({
10 "pay_with": "balance"
11 })
12});
13const data = await response.json();

Examples of answers

Paid from balance200application/json
 {
Balance is short202application/json
 {
Waiting for the user — app purchase202application/json
 {
No Idempotency-Key422application/json
 {
GET

Get an order

New/order/view/{id}

Get an order

Status of an order: draft, awaiting_payment, awaiting_approval, paid, expired or failed.

Notes

  • While it waits, the order repeats its checkout or approval link.

  • payment.due is what is still missing from the balance.

"data": {

"order": {

"id": "990dd34a-0165-4641-ab9d-94bea1007fe0",

"action": "new",

"product": "shared",

"status": "paid",

"expires_at": "2026-10-06T15:46:32Z",

"options": {

"count": 10,

"period": "1m",

"traffic": 100,

"countries": {},

"geo_service": "overall",

"ip_score": 0,

"unlimited_ips": false

},

"price": {

"currency": "USD",

"total": "1.96",

"total_usd": "1.96",

"lines": [

{

"key": "ips",

"amount_usd": "0.80"

},

{

"key": "traffic",

"amount_usd": "1.00"

}

],

"unit": {

"ip": "0.08",

"one_gb": null

},

"adjustments": [

{

"key": "sale",

"amount": "0.00"

}

]

},

"package_id": 14800,

"checkout": null,

"approval": null

},

"payment": {

"balance": "41.00",

"due": "0.00"

}

},

"meta": {}

}

This method requires authorization!
You can use your own API key, which can be obtained at control panel.

Query method

GEThttps://api.stableproxy.com/v3/order/view/{id}

Query parameters

IdentifierRegulationsExample
id1requiredstring990dd34a-0165-4641-ab9d-94bea1007fe0

Code examples

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/order/view/{id}", {
3 method: "GET",
4 headers: {
5 "Authorization": "Bearer [YOUR TOKEN]",
6 "Content-Type": "application/json"
7 }
8});
9const data = await response.json();

Examples of answers

Paid order200application/json
 {
GET

Poll an order for a status change

New/order/wait/{id}

Wait for an order

The same answer as Get an order plus retry_after (seconds). Poll with that delay until the status is final — retry_after is then null.

"data": {

"order": {

"id": "990dd34a-0165-4641-ab9d-94bea1007fe0",

"status": "awaiting_payment",

"package_id": null

},

"retry_after": 2

},

"meta": {}

}

This method requires authorization!
You can use your own API key, which can be obtained at control panel.

Query method

GEThttps://api.stableproxy.com/v3/order/wait/{id}

Query parameters

IdentifierRegulationsExample
timeoutNot necessarilynullableinteger124
id1requiredstring990dd34a-0165-4641-ab9d-94bea1007fe0

Code examples

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/order/wait/{id}", {
3 method: "GET",
4 headers: {
5 "Authorization": "Bearer [YOUR TOKEN]",
6 "Content-Type": "application/json"
7 }
8});
9const data = await response.json();

Examples of answers

Still waiting200application/json
 {
GET

Read an order waiting for approval

New/order/approval/{id}

Query method

GEThttps://api.stableproxy.com/v3/order/approval/{id}

Query parameters

IdentifierRegulationsExample
id1required89

Code examples

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/order/approval/{id}", {
3 method: "GET",
4 headers: {
5 "Content-Type": "application/json"
6 }
7});
8const data = await response.json();
POST

Approve and pay an order an app is waiting on

New/order/approve/{id}

Query method

POSThttps://api.stableproxy.com/v3/order/approve/{id}

Query parameters

IdentifierRegulationsExample
tNot necessarilynullablestring107
id1required7

Code examples

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/order/approve/{id}", {
3 method: "POST",
4 headers: {
5 "Content-Type": "application/json"
6 },
7 body: JSON.stringify({
8 "t": 107
9 })
10});
11const data = await response.json();