Sessions
List and rotate a Proxio credential's active sticky sessions. GET returns every active session with remaining TTL, DELETE expires one or all. Rotation is rate-limited per credential.
A sticky session pins one residential IP for a window of time. These endpoints let you see a credential's active sessions and force rotation by expiring one or all of them.
Scopes: read for GET, write for the deletes.
List sessions
GET /services/{id}/credentials/{credId}/sessions returns the credential's
active sessions, no cursor.
Don't rely on a particular order or count
This endpoint returns sessions in no particular order and does not cap how many can appear, so treat the array as unordered and sort or limit it on your side if your integration needs that.
curl https://dashboard.proxio.net/api/v1/services/clpkg_2a9x/credentials/clsub_7h2k/sessions \
-H "Authorization: Bearer pxo_9fJ2kQ7xR4mN8pL1dW6vB3cH5tZ0aYqS7dK2mN9x"import requests
BASE = "https://dashboard.proxio.net/api/v1"
API_KEY = "pxo_9fJ2kQ7xR4mN8pL1dW6vB3cH5tZ0aYqS7dK2mN9x"
resp = requests.get(
f"{BASE}/services/clpkg_2a9x/credentials/clsub_7h2k/sessions",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=15,
)
resp.raise_for_status()
for s in resp.json()["data"]:
print(s["session_id"], s["remaining_ttl_seconds"])const BASE = "https://dashboard.proxio.net/api/v1"
const API_KEY = "pxo_9fJ2kQ7xR4mN8pL1dW6vB3cH5tZ0aYqS7dK2mN9x"
const res = await fetch(
`${BASE}/services/clpkg_2a9x/credentials/clsub_7h2k/sessions`,
{ headers: { Authorization: `Bearer ${API_KEY}` } },
)
for (const s of (await res.json()).data) {
console.log(s.session_id, s.remaining_ttl_seconds)
}200 response:
{
"data": [
{
"session_id": "k3n8f2p9q1ab1",
"remaining_ttl_seconds": 420,
"created_at": "2026-07-17T09:20:00.000Z"
}
],
"meta": { "request_id": "req_8Ke2jP4mQ" }
}created_at is null when the gateway doesn't report a start time for the
session.
Rotate one session
DELETE /services/{id}/credentials/{credId}/sessions/{sessId} expires a
single session, its next request draws a new IP. The response reports how many
sessions were expired.
curl -X DELETE \
https://dashboard.proxio.net/api/v1/services/clpkg_2a9x/credentials/clsub_7h2k/sessions/k3n8f2p9q1ab1 \
-H "Authorization: Bearer pxo_9fJ2kQ7xR4mN8pL1dW6vB3cH5tZ0aYqS7dK2mN9x"import requests
BASE = "https://dashboard.proxio.net/api/v1"
API_KEY = "pxo_9fJ2kQ7xR4mN8pL1dW6vB3cH5tZ0aYqS7dK2mN9x"
resp = requests.delete(
f"{BASE}/services/clpkg_2a9x/credentials/clsub_7h2k/sessions/k3n8f2p9q1ab1",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=15,
)
resp.raise_for_status()
print(resp.json()["data"]["expired"])const BASE = "https://dashboard.proxio.net/api/v1"
const API_KEY = "pxo_9fJ2kQ7xR4mN8pL1dW6vB3cH5tZ0aYqS7dK2mN9x"
const res = await fetch(
`${BASE}/services/clpkg_2a9x/credentials/clsub_7h2k/sessions/k3n8f2p9q1ab1`,
{ method: "DELETE", headers: { Authorization: `Bearer ${API_KEY}` } },
)
console.log((await res.json()).data.expired)200 response:
{ "data": { "expired": 1 }, "meta": { "request_id": "req_8Ke2jP4mQ" } }The operation is idempotent: expiring a session that doesn't exist returns
"expired": 0 rather than an error.
Rotate all sessions
DELETE /services/{id}/credentials/{credId}/sessions (no session id) expires
every active session on the credential at once.
curl -X DELETE \
https://dashboard.proxio.net/api/v1/services/clpkg_2a9x/credentials/clsub_7h2k/sessions \
-H "Authorization: Bearer pxo_9fJ2kQ7xR4mN8pL1dW6vB3cH5tZ0aYqS7dK2mN9x"import requests
BASE = "https://dashboard.proxio.net/api/v1"
API_KEY = "pxo_9fJ2kQ7xR4mN8pL1dW6vB3cH5tZ0aYqS7dK2mN9x"
resp = requests.delete(
f"{BASE}/services/clpkg_2a9x/credentials/clsub_7h2k/sessions",
headers={"Authorization": f"Bearer {API_KEY}"},
timeout=15,
)
resp.raise_for_status()
print(resp.json()["data"]["expired"])const BASE = "https://dashboard.proxio.net/api/v1"
const API_KEY = "pxo_9fJ2kQ7xR4mN8pL1dW6vB3cH5tZ0aYqS7dK2mN9x"
const res = await fetch(
`${BASE}/services/clpkg_2a9x/credentials/clsub_7h2k/sessions`,
{ method: "DELETE", headers: { Authorization: `Bearer ${API_KEY}` } },
)
console.log((await res.json()).data.expired)200 response:
{ "data": { "expired": 7 }, "meta": { "request_id": "req_8Ke2jP4mQ" } }Rotation is rate-limited
Rotation is capped at 30 calls per 60 seconds per credential. Exceeding it
returns RATE_LIMITED (429) with a
Retry-After header. If the gateway is briefly unreachable you'll get
UPSTREAM_ERROR (502), retry shortly.
Related pages
Whitelist (IP Auth)
Bind source IPs to a Proxio credential for passwordless authentication, with optional default geo and session settings. List, add, batch add, and remove bindings. Up to 50 per credential, 30 additions per minute. Covers INVALID_IP, IP_ALREADY_BOUND, and IP_UNAVAILABLE.
Locations
Fetch Proxio's geo-targeting catalog with GET /locations, the country, state, and city codes you can target, in ISO 3166-1 alpha-2 / ISO 3166-2 / city-slug form. Cacheable for an hour, with ETag / If-None-Match support for a cheap 304 on an unchanged catalog.

