---
title: "Place a wallet-paid order"
method: POST
path: "/v4/account/orders/create"
tags: ["API ordering"]
---

# Place a wallet-paid order

`POST /v4/account/orders/create`

Place a headless, wallet-paid order. The server forces `pay_with_credit=1` and `no_redirect=1` internally, so the order is debited from your wallet balance with no gateway redirect.

`email`, `fname`, and `lname` are derived from the authenticated identity. You can omit them, or pass them explicitly to override.

Permission: `account:api_ordering:write` (admin-grant-only — off by default for every account). Authenticate with the `api-token` header. The wallet balance must cover the order total at the moment the call lands.

## Request body

- object
  - `type` 'new_datacenter_shared' | 'new_residential' | 'new_residential_unlimited' | 'new_serp_api' | 'update_datacenter_shared' | 'update_datacenter_dedicated' | 'update_residential' | 'update_residential_unlimited' | 'update_serp_api', required — Product to order. `new_*` creates a new subaccount; `update_*` upgrades an existing one in place (more proxies/tokens/bandwidth or extended duration) and requires `account_id`. Each `update_*` accepts the same product-specific fields as its matching `new_*` — see the examples below.
  - `account_id` string — Required for `update_*` types: the `AccountID` of the subaccount to upgrade (from `/v4/account/subaccounts`). Must be a subaccount you own. Ignored for `new_*` types.
  - `dry_run` boolean — When `true`, returns a price quote without creating an order or debiting the wallet. Works for both `new_*` and `update_*`, and on a zero wallet balance.
  - `country` string — Billing country (full name, e.g. "Belgium"). Determines VAT. Required for `new_*` orders; optional for `update_*` (the subaccount's existing country is used).
  - `coupon_code` string — Optional coupon. Discount applies before any per-account API-ordering percentage (coupon first, then percentage on the post-coupon price). Coupons cannot be applied to wallet top-ups.
  - `fname` string — Override the first name from the authenticated account.
  - `lname` string — Override the last name from the authenticated account.

## Response `200`

For a real order: created and paid from the wallet — `data` is the bare order ID string. For `dry_run: true`: `data` is a price quote and no order is created or charged.

- object
  - `success` boolean
  - `data` union
    - string — Order ID (returned for wallet-credit orders).
    - object
      - `order_id` string, uuid
      - `order_url` string, nullable
    - object — Price quote, returned when `dry_run: true`.
      - `title` string
      - `price` string — Amount that would be debited from the wallet (pre-VAT; for upgrades, already net of credit for unused time on the current plan).
      - `original_price` string — Price before any coupon / per-account discount.
      - `extra_days` number

## Other responses

- `400` — Order rejected. Causes include bad pricing, invalid params, insufficient wallet, top-up + coupon, or — for `update_*` types — a missing `account_id` (`"account_id is required for update_* order types."`).
- `401` — Missing or invalid credentials.
- `403` — Either API ordering isn't enabled for this account (request the `account:api_ordering:write` grant from support), or an `update_*` request named an `account_id` that doesn't belong to the authenticated account.

---

[API](https://skmtc.net/proxyscrape/apis/proxyscrape-account-api.md) · [All operations](https://skmtc.net/proxyscrape/apis/proxyscrape-account-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/proxyscrape/proxyscrape-account-api/revisions/4e10267785e1/schema)
