Both endpoints are admin-grant-only. They’re off by default for every account. Contact support to enable
account:api_ordering:write (place orders) and/or account:api_ordering:read (read wallet balance).Surface
Both accept the same auth form as the rest of the Account API — see Authentication:
api-token: <your-api-key>— send your API key in theapi-tokenheader.
Place an order
The server forcespay_with_credit=1 and no_redirect=1 server-side — there’s no gateway redirect, the wallet is debited atomically right after the order row is created, and the call returns the new order ID.
email, fname, and lname are derived from the authenticated identity. Omit them, or pass them explicitly to override.
Per-product request shapes
Eachtype accepts a different set of product-specific fields, identical to what the marketing checkout submits.
country— Full country name (e.g."Belgium"), not the ISO code. VAT is derived from it.proxies[<location>]— Datacenter only. The location is one ofmixed,us,gb,de,fr,ca,es,it,br,th. Value is the IP-pool size.bandwidth— Datacenter:0means unlimited. Residential: bandwidth pack in GB.duration— Omit for non-expiry residential / SERP packages. Otherwise30d/60d/90d.location— Residential unlimited only. Server-location ID; list them via the dashboard’s Residential Unlimited page.coupon_code(optional) — Applied before any per-account API-ordering percentage discount.account_id(update_*only) — TheAccountIDof the subaccount to upgrade in place. Must be one you own. See Upgrade an existing subaccount.dry_run(optional) —truereturns a price quote without charging. See Price quote (dry run).
Response
For wallet-credit orders thedata field is the bare order ID string:
Upgrade an existing subaccount
To modify a subaccount you already own — more proxies/tokens, more bandwidth, or extended duration — use the matchingupdate_* type and pass the target subaccount’s account_id. The order is paid from your wallet just like a new purchase; the difference is it modifies the existing subaccount in place instead of provisioning a new one.
account_id is the AccountID returned by /v4/account/subaccounts (or by the order-status subaccount.AccountID when the subaccount was first created via the API).
account_id must be a subaccount that belongs to the authenticated account — it has to appear in your /v4/account/subaccounts list. A request naming an account_id you don’t own is rejected with 403. Omitting account_id on an update_* type is an error; to create a brand-new subaccount, use the corresponding new_* type instead.update_datacenter_shared, update_datacenter_dedicated, update_residential, update_residential_unlimited, update_serp_api. The product-specific fields are the same as the matching new_* type. Downgrades (fewer proxies/tokens than the current plan) are not supported over the API.
Price quote (dry run)
Senddry_run: true alongside any order request — new_* or update_* — to get the computed price without creating an order or debiting your wallet. The request shape is otherwise identical to the order you’d place, so you can quote and then submit by flipping a single flag.
data field carries the quote rather than an order ID:
priceis the amount that will be debited from your wallet (pre-VAT; forupdate_*it’s already net of credit for unused time on the current plan).original_priceis the price before any coupon / per-account discount.- A dry run works on zero wallet balance — it never reaches the balance check, so use it to preview cost before funding.
- A dry run requires the same
account:api_ordering:writepermission as a real order (it’s the same endpoint).
Check order status
POST /v4/account/orders/create returns the order ID synchronously, but the order processor that turns the order into a usable subaccount runs asynchronously. For wallet-paid orders this typically takes well under a second, but it’s not guaranteed.
Poll GET /v4/account/orders/{orderId}/status every 1–2 seconds until status === "processed". At that point data.subaccount is populated with the same shape as /v4/account/subaccounts entries — you can drop it straight into per-product endpoints.
AccountID is the value you pass as {subAccountId} to the product endpoints:
Sample polling loop
Statuses
Errors
Read wallet balance
include_counts=1 when you also need activity counts:
The endpoint scopes the read to the authenticated identity — a token can only ever read its own wallet.
Coupons and discounts
You can pass acoupon_code field on POST /v4/account/orders/create. The order then applies, in this order:
- Coupon code (if any) — percent or fixed amount off the product price.
- Per-account API-ordering percentage (if your account has one) — applied on top of the post-coupon price.
me endpoint’s api_ordering_discount field. The percentage is applied automatically — no flag to set.
Try it in the dashboard
The dashboard hosts a live playground for both endpoints at /account/api-orders. It builds the request body interactively, renders cURL / Python / Node snippets, and runs the request against your real wallet so you can verify everything works end-to-end before wiring it into your code.Permissions
These two permissions are documented in the permission reference:account:api_ordering:write— required forPOST /v4/account/orders/create.account:api_ordering:read— required forGET /v4/account/orders/balance.