To use a long-lived static residential IP, choose the product, location, and duration first, then create a static order. The official Static orders docs say a static order buys a fixed IP and requires a product, location, duration, and IP count. This page covers the first purchase and how to confirm the IP is ready. It does not repeat renew and release.
Do two things before you order: check account balance, and load a fresh productId, location codes, duration, and price from the product lookup. Do not type a stale product number. Authorized targets only. Not supported in mainland China.
What to prepare
| Item | Where it comes from |
|---|---|
| A live product query | productId (sent as poolId), countryCode, cityCode, duration, price, and stock |
| Shared or exclusive | Use product_type / productType and the project list; shared static also needs projectId |
| Enough wallet balance | Console or the balance API; top up first if needed, see USDT |
| A token and user id, if you use the API | See login; userId must be the ZTProxy system user id |
If you buy for yourself in the console, choose the product and duration on the screen. Do not read API userId as an external membership number. If you call POST /open/app/static/order/create-standard/v2, the docs require userId to be the ZTProxy user id, not a member id from your system. Map those identifiers first. If the field is missing, the request returns HTTP 422 before inventory, provisioning, or charging, and retrying the same body will not succeed.
Duration rules and provisioning
Documented duration units are below. The duration values you may send still come from the product query. This table is not a promise that every product offers every option.
unit | Meaning | Common documented duration values |
|---|---|---|
| 1 | Day | Ordinary static products are usually 30; some static resource products support 30, 90, and 365 |
| 3 | Month | 1, 3, 6, and 12; some static resource products support 1, 3, and 12 |
| 4 | Year | 1 |
The standard static create API accepts an order asynchronously. After parameter, permission, balance, and basic price checks pass, it first returns a platform order number. In the documented sample, queued: true and async: true only mean the order has entered background processing. They do not mean the resource is already provisioned. Instance IP, port, username, password, and final status come later from GET /open/app/static/order/list/v2. If the list still shows processing, instance data may be empty for a while. Query again until the order reaches a terminal success or failure state.
Example: create a static order
Fill poolId, location, and duration from the product query. The product number, city code, and amounts below are format samples, not live stock or a quote. This sample omits staticType on purpose: the docs say that field does not distinguish shared from exclusive, and it is not an ISP plan.
export ZTPROXY_BASE="https://backend.ztproxy.net/api"
export ZTPROXY_TOKEN="TOKEN_EXAMPLE_NOT_REAL"
# Official userId is an integer ZTProxy user id, not an external member id.
# 1001 appears in official docs as a sample only; it is not a live account.
USER_ID=1001
curl -X POST "$ZTPROXY_BASE/open/app/static/order/create-standard/v2" \
-H "Authorization: Bearer $ZTPROXY_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"orderType\": \"static_proxy\",
\"poolId\": \"YOUR_PRODUCT_ID_FROM_QUERY\",
\"countryCode\": \"US\",
\"cityCode\": \"NEW_YORK\",
\"ipCount\": 1,
\"cycleTimes\": 1,
\"duration\": 30,
\"unit\": 1,
\"unitPrice\": 0,
\"totalAmount\": 0,
\"remark\": \"API static order example\",
\"userId\": ${USER_ID}
}"
Replace YOUR_PRODUCT_ID_FROM_QUERY with the productId from the product query. Fill unitPrice and totalAmount from that same query. The 0 values in the sample are placeholders only, not a free order and not an official quote. Only dynamic orders tell you to send those compatibility fields as 0. If the product is shared static, also add the chosen projectId. After the order is accepted, save orderNo / order_no and use it later to query, renew, or release. Optional fields such as a specific IP or CIDR follow the official optional-field list; do not improvise undocumented usage.
How to confirm the order, and common pitfalls
| Situation | What to do |
|---|---|
The response is accepted and queued is true | Query the list with the order number and wait for a final status and instances. Do not assume you already have a usable IP |
The order is still processing and has no instances yet | Query again later; do not resubmit the same order immediately |
| The request timed out and you are not sure it was created | Search the list by request time, target user, and product first, then decide whether to retry |
HTTP 422 says userId is missing | Add the correct ZTProxy user id; do not retry the same body |
| Insufficient balance | Top up or reduce the purchase, then submit again |
| The IP is live and you later need more time or want to stop | See renew and release |
| A partner wants the IP on an allowlist | See allowlists; do not claim the partner will accept a residential exit |
Store and use the instance host, port, username, and password as separate fields. Do not write them as credentials@host. For a first connectivity check, see test with curl. A sticky session is not a static IP; see sticky versus static.
Compliance and scope
Use this only on authorized targets. Do not treat this page as a bypass or account-farming tutorial. Prices follow the console and Pricing (dynamic about $0.40/GB, about $0.20/GB for the 100 TB package; static shared about $1.50 and exclusive about $5 per IP per month). USDT/USDC are available; Visa/Mastercard are still being applied for. Not supported in mainland China.
FAQ
If queued is true, is the IP already ready?
No. It only means the order has entered background processing. Trust the final status and instances on the order list.
Do console purchases also require userId?
If you buy for yourself in the console, follow the on-screen flow. userId is required on the official create API as a ZTProxy system user id, not as an external member id that every console buyer must type.
Why does shared static need projectId?
The docs require a project code when the product is shared or the project list is not empty. Exclusive static products with an empty project list do not need it.
Are the New York example and the 0 amounts a quote?
No. The city code only shows format. Replace the amounts with prices from the product query. Stock and the payable amount follow the query and the console.
Why does the sample omit staticType?
The docs say staticType is not used to tell shared from exclusive. This site also does not sell it as an ISP plan. Use the product-shape fields instead.
Can I retry immediately after a 422?
No. Fix the field listed in detail[].loc, then submit again.
How do I release a static IP I no longer need? Is there an automatic refund?
Follow renew and release. Whether a refund or remaining term is issued follows the product policy. This page does not invent a percentage.
Where do prices come from?
Follow the console, the product query, and Pricing. Sample amounts in the docs are not a live quote.
Next steps
- Query the product and confirm shared or exclusive, stock, and price.
- Create the order, save the order number, and confirm instances on the list.
- After a successful check, use renew and release when you need more time or want to stop.