Endpoints on this page
GET /v1/mobile: List mobile portsGET /v1/mobile/{portId}: Get a mobile portPATCH /v1/mobile/{portId}: Rename, toggle auto-renew, or configure automatic rotationPOST /v1/mobile/{portId}/rotate: Change the IP nowGET /v1/mobile/{portId}/rotate: Rotation link (GET with API key in the query string)POST /v1/mobile/{portId}/relocate: Move the port to another country, carrier or cityPOST /v1/mobile/{portId}/reset-password: Generate a new proxy password for the portGET /v1/mobile/{portId}/ip-history: IPs assigned to the portGET /v1/mobile/{portId}/usage: Daily traffic through the port (bandwidth is unlimited; for information)GET /v1/catalog/countries/{countryCode}/carriers: Mobile carriers with available 4G/5G ports in a country
Base URL https://pontproxy.com/api/v1. Authentication, errors and limits: see the API overview.
List mobile ports
GET/v1/mobile
Authentication: API key in the Authorization: Bearer API_KEY header.
Response 200 OK
{
"data": [
{
"id": "mob_2v8k1q",
"label": "GB EE #1",
"status": "active",
"country": "GB",
"city": null,
"carrier": "ee",
"carrierName": "EE",
"networkType": "4G",
"currentIp": "172.58.14.201",
"ipChangedAt": "2026-10-05T14:03:11Z",
"endpoint": {
"host": "gw.pontproxy.com",
"httpPort": 7777,
"socksPort": 7778
},
"username": "USERNAME",
"password": "PASSWORD",
"rotation": {
"mode": "interval",
"intervalMinutes": 10
},
"minRotationIntervalSeconds": 30,
"rotationLink": "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/rotate?key=API_KEY",
"planId": "mob-uk-30d",
"autoRenew": false,
"createdAt": "2026-10-05T14:03:11Z",
"expiresAt": "2026-11-04T14:03:11Z"
}
]
}Code examples
curl -s "https://pontproxy.com/api/v1/mobile" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://pontproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/mobile", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://pontproxy.com/api/v1';
const res = await fetch(`${API}/mobile`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Get a mobile port
GET/v1/mobile/{portId}
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
portId | path | string | Yes | — |
Response 200 OK
{
"id": "mob_2v8k1q",
"label": "GB EE #1",
"status": "active",
"country": "GB",
"city": null,
"carrier": "ee",
"carrierName": "EE",
"networkType": "4G",
"currentIp": "172.58.14.201",
"ipChangedAt": "2026-10-05T14:03:11Z",
"endpoint": {
"host": "gw.pontproxy.com",
"httpPort": 7777,
"socksPort": 7778
},
"username": "USERNAME",
"password": "PASSWORD",
"rotation": {
"mode": "interval",
"intervalMinutes": 10
},
"minRotationIntervalSeconds": 30,
"rotationLink": "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/rotate?key=API_KEY",
"planId": "mob-uk-30d",
"autoRenew": false,
"createdAt": "2026-10-05T14:03:11Z",
"expiresAt": "2026-11-04T14:03:11Z"
}Code examples
curl -s "https://pontproxy.com/api/v1/mobile/mob_2v8k1q" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://pontproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/mobile/mob_2v8k1q", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://pontproxy.com/api/v1';
const res = await fetch(`${API}/mobile/mob_2v8k1q`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Rename, toggle auto-renew, or configure automatic rotation
PATCH/v1/mobile/{portId}
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
portId | path | string | Yes | — |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
label | string | No | max. 60 characters |
autoRenew | boolean | No | — |
rotation | object | No | — |
{
"rotation": {
"mode": "interval",
"intervalMinutes": 10
}
}{
"rotation": {
"mode": "manual",
"intervalMinutes": null
}
}Response 200 OK
{
"id": "mob_2v8k1q",
"label": "GB EE #1",
"status": "active",
"country": "GB",
"city": null,
"carrier": "ee",
"carrierName": "EE",
"networkType": "4G",
"currentIp": "172.58.14.201",
"ipChangedAt": "2026-10-05T14:03:11Z",
"endpoint": {
"host": "gw.pontproxy.com",
"httpPort": 7777,
"socksPort": 7778
},
"username": "USERNAME",
"password": "PASSWORD",
"rotation": {
"mode": "interval",
"intervalMinutes": 10
},
"minRotationIntervalSeconds": 30,
"rotationLink": "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/rotate?key=API_KEY",
"planId": "mob-uk-30d",
"autoRenew": false,
"createdAt": "2026-10-05T14:03:11Z",
"expiresAt": "2026-11-04T14:03:11Z"
}Code examples
curl -s -X PATCH "https://pontproxy.com/api/v1/mobile/mob_2v8k1q" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"rotation":{"mode":"interval","intervalMinutes":10}}'import os
import requests
API = "https://pontproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.patch(f"{API}/mobile/mob_2v8k1q", headers=HEADERS, json={"rotation": {"mode": "interval", "intervalMinutes": 10}}, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://pontproxy.com/api/v1';
const res = await fetch(`${API}/mobile/mob_2v8k1q`, {
method: 'PATCH',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ rotation: { mode: 'interval', intervalMinutes: 10 } }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Change the IP now
POST/v1/mobile/{portId}/rotate
Reconnects the modem to get a new carrier IP. Usually 5–15 s. Limited to one rotation every 30 seconds → 429 rotation_too_soon with Retry-After. The new IP is not guaranteed to differ (carrier CGNAT pools can hand back the same IP).
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
portId | path | string | Yes | — |
Response 200 OK
{
"ip": "172.58.14.201",
"previousIp": "172.58.9.77",
"rotatedAt": "2026-10-05T14:03:11Z",
"nextRotationAvailableAt": "2026-10-05T14:03:41Z"
}Code examples
curl -s -X POST "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/rotate" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://pontproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.post(f"{API}/mobile/mob_2v8k1q/rotate", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://pontproxy.com/api/v1';
const res = await fetch(`${API}/mobile/mob_2v8k1q/rotate`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Rotation link (GET with API key in the query string)
GET/v1/mobile/{portId}/rotate
Same as POST, for scripts and bookmarks: GET https://pontproxy.com/api/v1/mobile/{portId}/rotate?key=API_KEY. The key needs the proxies scope. format=text returns the new IP as text/plain.
Authentication: API key in the key query parameter (scope proxies), so the link works from a bookmark.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
key | query | string | Yes | Your API key (scope proxies). |
portId | path | string | Yes | — |
format | query | json · text | No | default json |
Response 200 OK
{
"ip": "172.58.14.201",
"previousIp": "172.58.9.77",
"rotatedAt": "2026-10-05T14:03:11Z",
"nextRotationAvailableAt": "2026-10-05T14:03:41Z"
}Code examples
curl -s "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/rotate?key=$API_KEY&format=text"import os
import requests
API = "https://pontproxy.com/api/v1"
r = requests.get(f"{API}/mobile/mob_2v8k1q/rotate", params={"key": os.environ["API_KEY"], "format": "text"}, timeout=30)
r.raise_for_status()
print(r.text)// Node.js 18+ (built-in fetch), ES module
const API = 'https://pontproxy.com/api/v1';
const res = await fetch(`${API}/mobile/mob_2v8k1q/rotate?key=${process.env.API_KEY}&format=text`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.text());Move the port to another country, carrier or city
POST/v1/mobile/{portId}/relocate
Moves the subscription to a free modem matching the request; the remaining time is kept. Host, ports and credentials may change. The port is provisioning until the new modem is online (usually < 2 min). 409 location_unavailable when no modem is free there (list availability with GET /v1/catalog/countries/{countryCode}/carriers).
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
portId | path | string | Yes | — |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
country | string | Yes | ISO 3166-1 alpha-2, upper case. |
carrier | string | Yes | — |
city | string, nullable | No | — |
{
"country": "GB",
"carrier": "ee"
}Response 202 Accepted
{
"id": "mob_2v8k1q",
"label": "GB EE #1",
"status": "active",
"country": "GB",
"city": null,
"carrier": "ee",
"carrierName": "EE",
"networkType": "4G",
"currentIp": "172.58.14.201",
"ipChangedAt": "2026-10-05T14:03:11Z",
"endpoint": {
"host": "gw.pontproxy.com",
"httpPort": 7777,
"socksPort": 7778
},
"username": "USERNAME",
"password": "PASSWORD",
"rotation": {
"mode": "interval",
"intervalMinutes": 10
},
"minRotationIntervalSeconds": 30,
"rotationLink": "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/rotate?key=API_KEY",
"planId": "mob-uk-30d",
"autoRenew": false,
"createdAt": "2026-10-05T14:03:11Z",
"expiresAt": "2026-11-04T14:03:11Z"
}Code examples
curl -s -X POST "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/relocate" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"country":"GB","carrier":"ee"}'import os
import requests
API = "https://pontproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.post(f"{API}/mobile/mob_2v8k1q/relocate", headers=HEADERS, json={"country": "GB", "carrier": "ee"}, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://pontproxy.com/api/v1';
const res = await fetch(`${API}/mobile/mob_2v8k1q/relocate`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ country: 'GB', carrier: 'ee' }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Generate a new proxy password for the port
POST/v1/mobile/{portId}/reset-password
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
portId | path | string | Yes | — |
Response 200 OK
{
"id": "mob_2v8k1q",
"label": "GB EE #1",
"status": "active",
"country": "GB",
"city": null,
"carrier": "ee",
"carrierName": "EE",
"networkType": "4G",
"currentIp": "172.58.14.201",
"ipChangedAt": "2026-10-05T14:03:11Z",
"endpoint": {
"host": "gw.pontproxy.com",
"httpPort": 7777,
"socksPort": 7778
},
"username": "USERNAME",
"password": "PASSWORD",
"rotation": {
"mode": "interval",
"intervalMinutes": 10
},
"minRotationIntervalSeconds": 30,
"rotationLink": "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/rotate?key=API_KEY",
"planId": "mob-uk-30d",
"autoRenew": false,
"createdAt": "2026-10-05T14:03:11Z",
"expiresAt": "2026-11-04T14:03:11Z"
}Code examples
curl -s -X POST "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/reset-password" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://pontproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.post(f"{API}/mobile/mob_2v8k1q/reset-password", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://pontproxy.com/api/v1';
const res = await fetch(`${API}/mobile/mob_2v8k1q/reset-password`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());IPs assigned to the port
GET/v1/mobile/{portId}/ip-history
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
portId | path | string | Yes | — |
page | query | integer | No | ≥ 1, default 1 |
perPage | query | integer | No | 1–100, default 20 |
Response 200 OK
{
"data": [
{
"ip": "172.58.14.201",
"assignedAt": "2026-10-05T14:03:11Z",
"releasedAt": null,
"trigger": "manual"
}
],
"pagination": {
"page": 1,
"perPage": 20,
"total": 1,
"totalPages": 1
}
}Code examples
curl -s "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/ip-history" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://pontproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/mobile/mob_2v8k1q/ip-history", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://pontproxy.com/api/v1';
const res = await fetch(`${API}/mobile/mob_2v8k1q/ip-history`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Daily traffic through the port (bandwidth is unlimited; for information)
GET/v1/mobile/{portId}/usage
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
portId | path | string | Yes | — |
from | query | string (date) | No | First day (UTC), inclusive. Default = 29 days before to. |
to | query | string (date) | No | Last day (UTC), inclusive. Default = today. Maximum range 366 days. |
Response 200 OK
{
"from": "2026-10-04",
"to": "2026-10-05",
"totalBytes": 2350000000,
"totalRequests": 48210,
"points": [
{
"date": "2026-10-04",
"bytes": 1200000000,
"requests": 24800
},
{
"date": "2026-10-05",
"bytes": 1150000000,
"requests": 23410
}
],
"byCountry": [
{
"country": "GB",
"bytes": 2350000000
}
]
}Code examples
curl -s "https://pontproxy.com/api/v1/mobile/mob_2v8k1q/usage" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://pontproxy.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/mobile/mob_2v8k1q/usage", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://pontproxy.com/api/v1';
const res = await fetch(`${API}/mobile/mob_2v8k1q/usage`, {
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Mobile carriers with available 4G/5G ports in a country
GET/v1/catalog/countries/{countryCode}/carriers
Public: no API key needed.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
countryCode | path | string | Yes | ISO 3166-1 alpha-2, upper case. |
Response 200 OK
{
"data": [
{
"id": "ee",
"name": "EE",
"networkTypes": [
"4G",
"5G"
],
"available": true,
"cities": []
}
]
}Code examples
curl -s "https://pontproxy.com/api/v1/catalog/countries/US/carriers"import os
import requests
API = "https://pontproxy.com/api/v1"
r = requests.get(f"{API}/catalog/countries/US/carriers", timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://pontproxy.com/api/v1';
const res = await fetch(`${API}/catalog/countries/US/carriers`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());