Endpoints on this page
GET /v1/residential/subscriptions: List traffic subscriptions (residential and rotating mobile per GB)GET /v1/residential/subscriptions/{subscriptionId}: Get a residential subscriptionPATCH /v1/residential/subscriptions/{subscriptionId}: Rename or toggle auto-renewPOST /v1/residential/subscriptions/{subscriptionId}/reset-password: Generate a new proxy password for the main userGET /v1/residential/subscriptions/{subscriptionId}/usage: Daily traffic usageGET /v1/residential/subscriptions/{subscriptionId}/sub-users: List sub-users (separate proxy credentials with their own traffic cap)POST /v1/residential/subscriptions/{subscriptionId}/sub-users: Create a sub-userPATCH /v1/residential/subscriptions/{subscriptionId}/sub-users/{subUserId}: Update a sub-user (label, cap, enable/disable, new password)DELETE /v1/residential/subscriptions/{subscriptionId}/sub-users/{subUserId}: Delete a sub-userGET /v1/catalog/countries: Countries where a product is availableGET /v1/catalog/countries/{countryCode}/cities: Targetable cities in a countryGET /v1/catalog/countries/{countryCode}/asns: Targetable ISPs (ASN) in a country — residential only
Base URL https://menaproxies.com/api/v1. Authentication, errors and limits: see the API overview.
Sticky sessions
Add -session-{id}-ttl-{minutes} to the proxy username to keep the same IP: {id} is 1–32 letters or digits of your choice, ttl is 1–30 minutes. The IP can change earlier, for example when the device behind it goes offline.
List traffic subscriptions (residential and rotating mobile per GB)
GET/v1/residential/subscriptions
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
productId | query | residential · mobile-gb | No | Only this product (absent: both). |
Response 200 OK
{
"data": [
{
"id": "res_9x2m4k",
"productId": "residential",
"label": "Residential #1",
"planId": "res-10",
"status": "active",
"trafficTotalBytes": 10000000000,
"trafficUsedBytes": 2350000000,
"trafficRemainingBytes": 7650000000,
"expiresAt": null,
"autoRenew": false,
"username": "u7k2m9",
"password": "PASSWORD",
"endpoint": {
"host": "gw.menaproxies.com",
"httpPort": 7777,
"socksPort": 7778
},
"subUserCount": 1,
"createdAt": "2026-10-05T14:03:11Z"
}
]
}Code examples
curl -s "https://menaproxies.com/api/v1/residential/subscriptions" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://menaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/residential/subscriptions", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions`, {
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 residential subscription
GET/v1/residential/subscriptions/{subscriptionId}
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionId | path | string | Yes | — |
Response 200 OK
{
"id": "res_9x2m4k",
"productId": "residential",
"label": "Residential #1",
"planId": "res-10",
"status": "active",
"trafficTotalBytes": 10000000000,
"trafficUsedBytes": 2350000000,
"trafficRemainingBytes": 7650000000,
"expiresAt": null,
"autoRenew": false,
"username": "u7k2m9",
"password": "PASSWORD",
"endpoint": {
"host": "gw.menaproxies.com",
"httpPort": 7777,
"socksPort": 7778
},
"subUserCount": 1,
"createdAt": "2026-10-05T14:03:11Z"
}Code examples
curl -s "https://menaproxies.com/api/v1/residential/subscriptions/res_9x2m4k" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://menaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/residential/subscriptions/res_9x2m4k", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k`, {
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 or toggle auto-renew
PATCH/v1/residential/subscriptions/{subscriptionId}
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionId | path | string | Yes | — |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
label | string | No | max. 60 characters |
autoRenew | boolean | No | — |
{
"label": "Price monitoring",
"autoRenew": true
}Response 200 OK
{
"id": "res_9x2m4k",
"productId": "residential",
"label": "Residential #1",
"planId": "res-10",
"status": "active",
"trafficTotalBytes": 10000000000,
"trafficUsedBytes": 2350000000,
"trafficRemainingBytes": 7650000000,
"expiresAt": null,
"autoRenew": false,
"username": "u7k2m9",
"password": "PASSWORD",
"endpoint": {
"host": "gw.menaproxies.com",
"httpPort": 7777,
"socksPort": 7778
},
"subUserCount": 1,
"createdAt": "2026-10-05T14:03:11Z"
}Code examples
curl -s -X PATCH "https://menaproxies.com/api/v1/residential/subscriptions/res_9x2m4k" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"label":"Price monitoring","autoRenew":true}'import os
import requests
API = "https://menaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.patch(f"{API}/residential/subscriptions/res_9x2m4k", headers=HEADERS, json={"label": "Price monitoring", "autoRenew": True}, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k`, {
method: 'PATCH',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ label: 'Price monitoring', autoRenew: true }),
});
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 main user
POST/v1/residential/subscriptions/{subscriptionId}/reset-password
The old password stops working within 60 seconds at the gateway.
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionId | path | string | Yes | — |
Response 200 OK
{
"id": "res_9x2m4k",
"productId": "residential",
"label": "Residential #1",
"planId": "res-10",
"status": "active",
"trafficTotalBytes": 10000000000,
"trafficUsedBytes": 2350000000,
"trafficRemainingBytes": 7650000000,
"expiresAt": null,
"autoRenew": false,
"username": "u7k2m9",
"password": "PASSWORD",
"endpoint": {
"host": "gw.menaproxies.com",
"httpPort": 7777,
"socksPort": 7778
},
"subUserCount": 1,
"createdAt": "2026-10-05T14:03:11Z"
}Code examples
curl -s -X POST "https://menaproxies.com/api/v1/residential/subscriptions/res_9x2m4k/reset-password" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://menaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.post(f"{API}/residential/subscriptions/res_9x2m4k/reset-password", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/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());Daily traffic usage
GET/v1/residential/subscriptions/{subscriptionId}/usage
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionId | 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. |
subUserId | query | string | No | Restrict to one sub-user. |
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": "AE",
"bytes": 2350000000
}
]
}Code examples
curl -s "https://menaproxies.com/api/v1/residential/subscriptions/res_9x2m4k/usage" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://menaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/residential/subscriptions/res_9x2m4k/usage", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/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());List sub-users (separate proxy credentials with their own traffic cap)
GET/v1/residential/subscriptions/{subscriptionId}/sub-users
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionId | path | string | Yes | — |
Response 200 OK
{
"data": [
{
"id": "sub_3m9qk2",
"label": "Client A",
"username": "u7k2m9_scraper",
"password": "PASSWORD",
"trafficLimitBytes": 5000000000,
"trafficUsedBytes": 1200000000,
"enabled": true,
"createdAt": "2026-10-05T14:03:11Z"
}
],
"limit": 50
}Code examples
curl -s "https://menaproxies.com/api/v1/residential/subscriptions/res_9x2m4k/sub-users" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://menaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.get(f"{API}/residential/subscriptions/res_9x2m4k/sub-users", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/sub-users`, {
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());Create a sub-user
POST/v1/residential/subscriptions/{subscriptionId}/sub-users
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionId | path | string | Yes | — |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
label | string | Yes | max. 60 characters |
password | string | No | Generated when omitted. — max. 64 characters |
trafficLimitBytes | integer (int64), nullable | No | ≥ 0 |
{
"label": "Scraper EU",
"trafficLimitBytes": 5000000000
}Response 201 Created
{
"id": "sub_3m9qk2",
"label": "Client A",
"username": "u7k2m9_scraper",
"password": "PASSWORD",
"trafficLimitBytes": 5000000000,
"trafficUsedBytes": 1200000000,
"enabled": true,
"createdAt": "2026-10-05T14:03:11Z"
}Code examples
curl -s -X POST "https://menaproxies.com/api/v1/residential/subscriptions/res_9x2m4k/sub-users" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"label":"Scraper EU","trafficLimitBytes":5000000000}'import os
import requests
API = "https://menaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.post(f"{API}/residential/subscriptions/res_9x2m4k/sub-users", headers=HEADERS, json={"label": "Scraper EU", "trafficLimitBytes": 5000000000}, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/sub-users`, {
method: 'POST',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ label: 'Scraper EU', trafficLimitBytes: 5000000000 }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Update a sub-user (label, cap, enable/disable, new password)
PATCH/v1/residential/subscriptions/{subscriptionId}/sub-users/{subUserId}
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionId | path | string | Yes | — |
subUserId | path | string | Yes | — |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
label | string | No | max. 60 characters |
trafficLimitBytes | integer (int64), nullable | No | ≥ 0 |
enabled | boolean | No | — |
regeneratePassword | boolean | No | — |
{
"enabled": false
}Response 200 OK
{
"id": "sub_3m9qk2",
"label": "Client A",
"username": "u7k2m9_scraper",
"password": "PASSWORD",
"trafficLimitBytes": 5000000000,
"trafficUsedBytes": 1200000000,
"enabled": true,
"createdAt": "2026-10-05T14:03:11Z"
}Code examples
curl -s -X PATCH "https://menaproxies.com/api/v1/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"enabled":false}'import os
import requests
API = "https://menaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.patch(f"{API}/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2", headers=HEADERS, json={"enabled": False}, timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2`, {
method: 'PATCH',
headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ enabled: false }),
});
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Delete a sub-user
DELETE/v1/residential/subscriptions/{subscriptionId}/sub-users/{subUserId}
Authentication: API key in the Authorization: Bearer API_KEY header.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
subscriptionId | path | string | Yes | — |
subUserId | path | string | Yes | — |
Response 204 No Content
No body: the status code is the answer.
Code examples
curl -s -X DELETE "https://menaproxies.com/api/v1/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2" \
-H "Authorization: Bearer $API_KEY"import os
import requests
API = "https://menaproxies.com/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['API_KEY']}"}
r = requests.delete(f"{API}/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2", headers=HEADERS, timeout=30)
r.raise_for_status()
print(r.status_code) # 204: done// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/residential/subscriptions/res_9x2m4k/sub-users/sub_3m9qk2`, {
method: 'DELETE',
headers: { Authorization: `Bearer ${process.env.API_KEY}` },
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
console.log(res.status); // 204: doneCountries where a product is available
GET/v1/catalog/countries
Public: no API key needed.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
product | query | string | No | Restrict to locations where this product is available (residential, mobile, mobile-gb). |
Response 200 OK
{
"data": [
{
"code": "AE",
"name": "United Arab Emirates",
"region": "Asia",
"products": [
"residential",
"mobile",
"mobile-gb"
],
"cities": 6,
"asns": 2,
"carriers": 2
}
]
}Code examples
curl -s "https://menaproxies.com/api/v1/catalog/countries"import os
import requests
API = "https://menaproxies.com/api/v1"
r = requests.get(f"{API}/catalog/countries", timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/catalog/countries`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Targetable cities in a country
GET/v1/catalog/countries/{countryCode}/cities
With product=mobile or product=mobile-gb, only the cities where 4G/5G modems exist.
Public: no API key needed.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
countryCode | path | string | Yes | ISO 3166-1 alpha-2, upper case. |
product | query | string | No | Restrict to locations where this product is available (residential, mobile, mobile-gb). |
Response 200 OK
{
"data": [
{
"id": "dubai",
"name": "Dubai",
"state": null
}
]
}Code examples
curl -s "https://menaproxies.com/api/v1/catalog/countries/AE/cities"import os
import requests
API = "https://menaproxies.com/api/v1"
r = requests.get(f"{API}/catalog/countries/AE/cities", timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/catalog/countries/AE/cities`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());Targetable ISPs (ASN) in a country — residential only
GET/v1/catalog/countries/{countryCode}/asns
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": [
{
"asn": 7922,
"name": "Comcast Cable"
}
]
}Code examples
curl -s "https://menaproxies.com/api/v1/catalog/countries/AE/asns"import os
import requests
API = "https://menaproxies.com/api/v1"
r = requests.get(f"{API}/catalog/countries/AE/asns", timeout=30)
r.raise_for_status()
print(r.json())// Node.js 18+ (built-in fetch), ES module
const API = 'https://menaproxies.com/api/v1';
const res = await fetch(`${API}/catalog/countries/AE/asns`);
if (!res.ok) throw new Error((await res.json()).error?.message ?? `HTTP ${res.status}`);
console.log(await res.json());