# Proxies, usage & orders API
Source: https://proxuno.com/docs/api-proxies
Updated: 2026-09-30

REST API

Reference for GET /proxies, GET /proxies/{id}, POST /proxies/{id}/rotate, PATCH /proxies/{id}, GET /usage and GET /orders — parameters, responses and examples.

Updated 30 Sept 2026 2 min read API v1

### On this page

- [List proxies](#list-proxies)
- [Get one proxy](#get-one-proxy)
- [Rotate a mobile IP](#rotate-a-mobile-ip)
- [Update a proxy](#update-a-proxy)
- [Usage](#usage)
- [Orders](#orders)

All paths are relative to `https://proxuno.com/api/v1` and require an API key ([Authentication](/docs/authentication#api-keys)). Responses use the `{"data": …}` envelope described in the [overview](/docs/api#conventions).

## List proxies[#](#list-proxies)

HTTPCopy

```http
GET /proxies?type=mobile&country=fr&status=active
```

| Parameter | Values | Default |
| --- | --- | --- |
| `type` | `mobile` · `static` | both |
| `country` | ISO code, e.g. `fr`, `gb` | all |
| `status` | `active` · `expiring` (active, ends within 3 days) · `expired` · `suspended` | all |

cURLPythonNode.js

Copy

```bash
curl -s "https://proxuno.com/api/v1/proxies?type=mobile&status=active" -H "Authorization: Bearer $PROXUNO_API_KEY"
```

```python
import os, httpx

api = httpx.Client(base_url="https://proxuno.com/api/v1", headers={"Authorization": f"Bearer {os.environ['PROXUNO_API_KEY']}"}, timeout=30)
for p in api.get("/proxies", params={"type": "mobile", "status": "active"}).json()["data"]:
print(p["id"], p["country"], p["carrier"], p["ip"], p["expires_at"])
```

```javascript
const res = await fetch("https://proxuno.com/api/v1/proxies?type=mobile&status=active", {
headers: { Authorization: `Bearer ${process.env.PROXUNO_API_KEY}` },
});
const { data, meta } = await res.json();
console.log(meta.total, data.map((p) => `${p.host}:${p.ports.http}`));
```

Response:

JSONCopy

```json
{
"data": [
{
"id": 1482,
"type": "mobile",
"status": "active",
"country": "fr",
"carrier": "orange",
"isp": null,
"tech": "5G",
"label": "serp-fr-01",
"ip": "198.51.100.181",
"host": "fr.mobile.gw.proxuno.com",
"ports": { "http": 10421, "socks5": 20421 },
"username": "m_k3v9q2xa",
"password": "Hq7Lr2Nw8Zt4Bc6D",
"auto_renew": true,
"duration": "30d",
"starts_at": "2026-09-12T08:30:00.000Z",
"expires_at": "2026-10-12T08:30:00.000Z",
"created_at": "2026-09-12T08:30:00.000Z",
"rotation": {
"interval_min": 10,
"last_rotated_at": "2026-09-30T14:05:12.000Z",
"rotations_count": 412,
"link": "https://proxuno.com/rotate/9f3c1e7a2b8d4c60a1e5f7b3d9c2e8a4"
}
}
],
"meta": { "total": 1 }
}
```

Static ISP proxies have `"type": "static"`, `carrier: null`, the provider name in `isp`, the IP as `host`, and no `rotation` object.

## Get one proxy[#](#get-one-proxy)

HTTPCopy

```http
GET /proxies/{id}
```

Returns the same object as in the list. An id that does not exist or belongs to another account returns `404 not_found`.

## Rotate a mobile IP[#](#rotate-a-mobile-ip)

HTTPCopy

```http
POST /proxies/{id}/rotate
```

No body. Returns once the modem has a new address:

JSONCopy

```json
{
"data": {
"id": 1482,
"ip": "198.51.100.207",
"previous_ip": "198.51.100.181",
"rotated_at": "2026-09-30T14:07:40.000Z",
"next_rotation_at": "2026-09-30T14:07:50.000Z"
}
}
```

| Status | Code | When |
| --- | --- | --- |
| `400` | `validation_error` | The proxy is a static ISP proxy. |
| `403` | `forbidden` | The proxy is expired or suspended. |
| `404` | `not_found` | Unknown id. |
| `429` | `rotation_cooldown` | Less than 10 seconds since the previous manual rotation. `Retry-After` gives the wait. |

More context in [IP rotation](/docs/ip-rotation).

## Update a proxy[#](#update-a-proxy)

HTTPCopy

```http
PATCH /proxies/{id}
Content-Type: application/json
```

| Field | Type | Meaning |
| --- | --- | --- |
| `rotation_interval_min` | integer | `0` = off, or 2–60 minutes. Mobile proxies only. |
| `auto_renew` | boolean | Renew from the prepaid balance 24 hours before expiry (6 hours for 24-hour plans). |
| `label` | string ≤ 60 or `null` | Your own name for the proxy, shown in the dashboard and exports. |

Send only the fields you want to change; at least one is required. Unknown fields are rejected.

cURLCopy

```bash
curl -s -X PATCH https://proxuno.com/api/v1/proxies/1482 \
-H "Authorization: Bearer $PROXUNO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"rotation_interval_min": 5, "auto_renew": true}'
```

The response is the updated proxy object. A value outside the allowed range returns `400 validation_error` with the offending field in `error.fields`:

JSONCopy

```json
{
"error": {
"code": "validation_error",
"message": "Some fields need your attention.",
"fields": { "rotation_interval_min": "Choose an interval between 2 and 60 minutes, or turn automatic rotation off." }
}
}
```

## Usage[#](#usage)

HTTPCopy

```http
GET /usage?from=2026-09-01&to=2026-09-30
```

| Parameter | Format | Default |
| --- | --- | --- |
| `from` | `YYYY-MM-DD` (UTC) | 29 days before `to` |
| `to` | `YYYY-MM-DD` (UTC) | today |
| `proxy_id` | integer | all proxies and residential |

The range may cover up to 366 days. One entry per day, bytes per product:

JSONCopy

```json
{
"data": [
{ "date": "2026-09-29", "mobile_bytes": 4182000000, "residential_bytes": 512300000, "static_bytes": 902000000, "bytes": 5596300000, "requests": 48210 },
{ "date": "2026-09-30", "mobile_bytes": 3907000000, "residential_bytes": 488100000, "static_bytes": 875000000, "bytes": 5270100000, "requests": 45876 }
],
"meta": {
"from": "2026-09-29", "to": "2026-09-30", "days": 2,
"totals": { "mobile_bytes": 8089000000, "residential_bytes": 1000400000, "static_bytes": 1777000000, "bytes": 10866400000, "requests": 94086 }
}
}
```

Only `residential_bytes` is billed; mobile and static traffic is unlimited and reported for your own monitoring. Today's figures are updated every few minutes.

## Orders[#](#orders)

HTTPCopy

```http
GET /orders?status=fulfilled&limit=25&offset=0
```

| Parameter | Values | Default |
| --- | --- | --- |
| `status` | `pending` · `awaiting_payment` · `paid` · `fulfilled` · `expired` · `cancelled` · `refunded` | all |
| `limit` | 1–100 | 25 |
| `offset` | ≥ 0 | 0 |

JSONCopy

```json
{
"data": [
{
"ref": "ORD-2026-01482",
"kind": "purchase",
"status": "fulfilled",
"currency": "USD",
"subtotal_cents": 31500,
"discount_cents": 0,
"total_cents": 31500,
"payment_method": "balance",
"created_at": "2026-09-30T08:21:03.000Z",
"paid_at": "2026-09-30T08:21:03.000Z",
"items": [
{ "product": "mobile", "description": "3 × mobile proxies — France · Orange · 30 days", "country": "fr", "carrier": "orange", "duration": "30d", "gb": null, "quantity": 3, "unit_cents": 10500, "total_cents": 31500 }
]
}
],
"meta": { "total": 16, "limit": 25, "offset": 0 }
}
```

`kind` is `purchase`, `topup` or `renewal`. Purchases and renewals are paid from the balance (`payment_method` `balance`) and are `paid` as soon as they are created; only top-ups are paid in crypto and can be `awaiting_payment` or `expired`. Amounts are integer cents of the `currency`. Orders are read-only through the API: there is no endpoint to create purchases or crypto invoices — add funds and buy in the dashboard.

Something unclear, outdated or wrong on this page? Tell us — documentation issues are fixed in the next release at the latest.

[Report an issue with this page](/contact?topic=support&subject=Documentation%20issue%3A%20Proxies%2C%20usage%20%26%20orders%20API)
