New here? Follow these steps
- 1Sign up with an email and password, or with a token, and open the dashboard.
- 2Issue an API key on the Connect tab. The full key appears only once, at the moment you issue it, so save it right there.
- 3Put the key in the Authorization header of every request that needs one.
- 4Call /account first to make sure the key is accepted, then place orders with /orders.
How does authentication work?
Requests that touch your own account (account, orders, proxy-user) need an API key. Send it in the header as Authorization: Bearer pwk_... Prices, countries and quotes are open to everyone and can be called without a key.
ProxyWorld servers never store the key itself, only a hash of it. If you lose a key, make a new one in the dashboard, and the old one is blocked right away. Put keys in server side code only. If a key ends up in code that runs in a browser or in a public repository, someone else can use it.
Authorization: Bearer pwk_your_api_key
Base URL and data format
- Base URL
- https://proxyworld.shop/api/v1
- Request and response bodies
- application/json
- Amounts
- USD as a number, for example 1058.50
- Timestamps
- ISO 8601 (UTC)
How many calls can I make?
Each API key can make 60 calls per minute. Public endpoints called without a key allow 60 calls per minute for each IP. Go over that and you get HTTP 429. Wait about a minute, then try again.
What comes back when something fails?
You get an HTTP status code and a JSON body holding a short error code and an explanation.
{
"error": {
"code": "insufficient_balance",
"message": "Your balance is too low for this order. Top up in the dashboard."
}
}| HTTP | code | Meaning |
|---|---|---|
| bad_requestHTTP 400A required value is missing, or a value was sent that this product does not accept. | A required value is missing, or a value was sent that this product does not accept. | |
| unauthorizedHTTP 401The API key is missing or is not a valid key. | The API key is missing or is not a valid key. | |
| insufficient_balanceHTTP 402Your balance is less than the order total. No money left your balance. | Your balance is less than the order total. No money left your balance. | |
| not_foundHTTP 404Your account has no order with this number. | Your account has no order with this number. | |
| rate_limitedHTTP 429You went over the number of calls allowed per minute. | You went over the number of calls allowed per minute. | |
| server_errorHTTP 500The server could not finish the request. No money left your balance. | The server could not finish the request. No money left your balance. |
Endpoints
View your account
GET/api/v1/accountAPI key needed
Returns how you sign in (login: email or token), your email, balance, proxy host and ports, proxy username and password, and Allowed IPs. For accounts created with a token, email is null.
curl https://proxyworld.shop/api/v1/account \ -H "Authorization: Bearer pwk_your_api_key"
{
"login": "email",
"email": "you@example.com",
"balance_usd": 1300,
"proxy": {
"host": "gate.proxyworld.shop",
"http_port": 6100,
"socks5_port": 6200,
"username": "pwexample1",
"password": "your_password"
},
"allowed_ips": [
"203.0.113.10"
]
}View products and prices
GET/api/v1/productsWorks without a key
Returns the order range for each product, the unit price for each quantity tier and the period discounts. It uses the same price table as the pricing page.
curl https://proxyworld.shop/api/v1/products
{
"currency": "USD",
"prices_as_of": "2026-10-31",
"products": [
{
"id": "unlimited",
"unit": "day",
"quantity": {
"meaning": "days",
"min": 1,
"max": 365
},
"...": "..."
},
{
"id": "residential",
"unit": "gb",
"...": "..."
}
]
}Countries and cities
GET/api/v1/countriesWorks without a key
Returns the countries you can pick for each product, along with the city values to use in the -city- username option.
| Name | Type | Meaning |
|---|---|---|
productOptional | string | One of unlimited, residential, isp, datacenter. If omitted, residential is used. |
curl "https://proxyworld.shop/api/v1/countries?product=datacenter"
{
"product": "datacenter",
"countries": [
{
"code": "us",
"name": "United States",
"region": "americas",
"datacenter": true,
"cities": [
{
"name": "New York",
"value": "new_york"
},
{
"name": "Los Angeles",
"value": "los_angeles"
}
]
}
]
}Get a quote
POST/api/v1/quoteWorks without a key
Works out the order total without touching your balance. Send the same body you would send to place the order.
| Name | Type | Meaning |
|---|---|---|
productRequired | string | One of unlimited, residential, isp, datacenter. |
quantityRequired | integer | How much to order: days for unlimited (1~365), GB for residential (5~5,000), number of IPs for isp (1~1,000) or datacenter (5~5,000). |
concurrencyOptional | integer | Unlimited only. Pick one of 200, 500, 1000, 2000. |
bandwidthOptional | integer | Unlimited only, in Mbps. One of 100, 200, 500, 1000. |
monthsOptional | integer | isp and datacenter only. One of 1, 3, 6, 12. |
countryOptional | string | isp and datacenter only. A two-letter country code such as jp. The accepted values are listed in /countries. |
curl -X POST https://proxyworld.shop/api/v1/quote \
-H "Content-Type: application/json" \
-d '{"product":"unlimited","quantity":30,"concurrency":1000,"bandwidth":200}'{
"product": "unlimited",
"quantity": 30,
"unit_price_usd": 8.05,
"unit": "day",
"total_usd": 241.5
}Place an order
POST/api/v1/ordersAPI key needed
Deducts the total from your balance and creates the order. It starts as pending (activating) and turns active once it is ready. An order that cannot be activated becomes refunded, and everything you paid goes back to your balance. If your balance is too low, you get 402.
| Name | Type | Meaning |
|---|---|---|
productRequired | string | One of unlimited, residential, isp, datacenter. |
quantityRequired | integer | How much to order: days for unlimited (1~365), GB for residential (5~5,000), number of IPs for isp (1~1,000) or datacenter (5~5,000). |
concurrencyOptional | integer | Unlimited only. Pick one of 200, 500, 1000, 2000. |
bandwidthOptional | integer | Unlimited only, in Mbps. One of 100, 200, 500, 1000. |
monthsOptional | integer | isp and datacenter only. One of 1, 3, 6, 12. |
countryOptional | string | isp and datacenter only. A two-letter country code such as jp. The accepted values are listed in /countries. |
curl -X POST https://proxyworld.shop/api/v1/orders \
-H "Authorization: Bearer pwk_your_api_key" \
-H "Content-Type: application/json" \
-d '{"product":"unlimited","quantity":30,"concurrency":1000,"bandwidth":200}'{
"order": {
"id": "PW-7KQ2M-X4HTD",
"product": "unlimited",
"quantity": 30,
"months": null,
"concurrency": 1000,
"bandwidth_mbps": 200,
"country": null,
"unit_price_usd": 8.05,
"total_usd": 241.5,
"status": "pending",
"created_at": "2026-10-31T09:12:44.120Z",
"updated_at": "2026-10-31T09:12:44.120Z"
},
"balance_usd": 1058.5
}View your orders
GET/api/v1/ordersAPI key needed
Shows up to 100 orders, starting with the most recent.
| Name | Type | Meaning |
|---|---|---|
statusOptional | string | One of pending, active, refunded. Leave it out to get orders in any status. |
curl "https://proxyworld.shop/api/v1/orders?status=pending" \ -H "Authorization: Bearer pwk_your_api_key"
{
"orders": [
{
"id": "PW-7KQ2M-X4HTD",
"product": "unlimited",
"quantity": 30,
"months": null,
"concurrency": 1000,
"bandwidth_mbps": 200,
"country": null,
"unit_price_usd": 8.05,
"total_usd": 241.5,
"status": "pending",
"created_at": "2026-10-31T09:12:44.120Z",
"updated_at": "2026-10-31T09:12:44.120Z"
}
]
}View one order
GET/api/v1/orders/{id}API key needed
Returns the order that matches an order number. Handy for checking whether activation has finished.
| Name | Type | Meaning |
|---|---|---|
idRequired | string | The order number, for example PW-7KQ2M-X4HTD. |
curl https://proxyworld.shop/api/v1/orders/PW-7KQ2M-X4HTD \ -H "Authorization: Bearer pwk_your_api_key"
{
"order": {
"id": "PW-7KQ2M-X4HTD",
"product": "unlimited",
"quantity": 30,
"months": null,
"concurrency": 1000,
"bandwidth_mbps": 200,
"country": null,
"unit_price_usd": 8.05,
"total_usd": 241.5,
"status": "active",
"created_at": "2026-10-31T09:12:44.120Z",
"updated_at": "2026-10-31T09:40:02.511Z"
}
}Build a proxy username
GET/api/v1/proxy-userAPI key needed
Returns a proxy username with your options attached, plus HTTP and SOCKS5 URLs you can paste as they are. If you do not send session, the IP changes on every request.
| Name | Type | Meaning |
|---|---|---|
productOptional | string | One of unlimited, residential, isp, datacenter. If omitted, unlimited is used. |
countryOptional | string | A two-letter country code, for example jp. |
cityOptional | string | A city value listed in /countries, for example tokyo. Send country along with it. |
sessionOptional | string | 1~32 letters and digits. Requests with the same session use the same IP. |
ttlOptional | integer | How long the session holds its IP, 1~60 minutes. If omitted, 30 minutes. |
curl "https://proxyworld.shop/api/v1/proxy-user?product=residential&country=jp&city=tokyo&session=job42&ttl=30" \ -H "Authorization: Bearer pwk_your_api_key"
{
"username": "pwexample1-zone-res-cc-jp-city-tokyo-sid-job42-ttl-30",
"password": "your_password",
"http": "http://pwexample1-zone-res-cc-jp-city-tokyo-sid-job42-ttl-30:your_password@gate.proxyworld.shop:6100",
"socks5": "socks5h://pwexample1-zone-res-cc-jp-city-tokyo-sid-job42-ttl-30:your_password@gate.proxyworld.shop:6200"
}End to end example
A single script that gets a quote, orders from your balance and then connects through an IP in Japan.
import requests
API = "https://proxyworld.shop/api/v1"
HEAD = {"Authorization": "Bearer pwk_your_api_key"}
# 1) Check the price first
plan = {"product": "residential", "quantity": 100}
print(requests.post(f"{API}/quote", json=plan).json())
# 2) Order from your balance
r = requests.post(f"{API}/orders", json=plan, headers=HEAD)
order = r.json()["order"]
print(order["id"], order["status"])
# 3) Get a username for Japanese IPs
u = requests.get(f"{API}/proxy-user", headers=HEAD,
params={"product": "residential", "country": "jp"}).json()
proxies = {"http": u["http"], "https": u["http"]}
print(requests.get("https://ipinfo.io/json", proxies=proxies, timeout=30).json())const API = "https://proxyworld.shop/api/v1";
const HEAD = { Authorization: "Bearer pwk_your_api_key", "Content-Type": "application/json" };
// Check the balance
const acc = await fetch(`${API}/account`, { headers: HEAD }).then((r) => r.json());
console.log(acc.balance_usd);
// Order 7 days of unlimited
const res = await fetch(`${API}/orders`, {
method: "POST",
headers: HEAD,
body: JSON.stringify({ product: "unlimited", quantity: 7, concurrency: 500, bandwidth: 100 }),
});
if (res.status === 402) console.log("Top up first");
else console.log((await res.json()).order.id);Orders placed through the API are handled just like dashboard orders and show up on the History tab with the rest. Swap pwk_your_api_key in the examples for your own API key.