Public API
Manage your account programmatically over a REST API. You can export ready-to-use proxy lists, manage your IP whitelist, read your subscriptions, and inspect or rotate Budget Unlimited sessions. All endpoints return JSON unless noted otherwise.
Base URL
All Public API endpoints live under a single base URL:
https://proxyomega.com/api
Responses are returned as application/json, except the proxy-list endpoint, which returns plain text by default (pass format=json for JSON). The API is designed for server-side clients such as curl, scripts, and backends; requests made directly from a web page in a browser are blocked by the cross-origin policy.
Authentication
Two schemes are used, depending on the endpoint:
| Scheme | Used by | How to send it |
|---|---|---|
| API key | Proxy-list export | api_key query parameter |
| Bearer token | All other endpoints on this page (the Session API can also be called with your proxy credentials) | Authorization: Bearer YOUR_TOKEN header |
API key
Your API key is shown on the dashboard Settings page, where you can also regenerate it (or use the API-key endpoints below). Pass it as the api_key query parameter:
curl "https://proxyomega.com/api/v1/proxy-list?api_key=YOUR_API_KEY&type=platinum"
Bearer token
Account endpoints (whitelist, subscriptions, session info) authenticate with the bearer token issued when you sign in to the dashboard. Send it in the Authorization header:
curl https://proxyomega.com/api/proxy/whitelist \
-H "Authorization: Bearer YOUR_TOKEN"
These tokens are session tokens and expire. There is currently no documented flow for minting long-lived tokens for unattended server-to-server use; if you need standing programmatic access to the account endpoints, email [email protected].
Requests without a valid token receive a 401:
{
"success": false,
"message": "Authentication required - no token",
"status_code": 401,
"timestamp": "2026-07-10T09:00:00+00:00"
}
Proxy-list export
GET /api/v1/proxy-list
Generates a ready-to-use proxy list for one of your active plans, in the format your tools expect.
| Parameter | Required | Description |
|---|---|---|
api_key | Yes | Your API key. |
type | Yes | Which plan to export: premium, platinum, mobile, or ipv6. Must match a plan that is active on your account. |
quantity | No | Number of proxy lines to return. Default 10, maximum 1000. |
format | No | Output format — see the list below. Default host:port:username:password. |
country | No | Two-letter country code; adds -country-xx to the generated usernames. |
city | No | City name (Premium Unlimited, Platinum, Mobile); adds -city-.... |
asn | No | ASN number (Premium Unlimited, Platinum); adds -asn-N. |
sticky | No | true to generate sticky-session usernames. A session ID is generated for you unless you pass session_id. |
session_id | No | Explicit sticky-session ID; adds -session-<id>. |
ttl | No | Sticky-session lifetime in minutes (Platinum, Mobile, IPv6); adds -ttl-N. |
protocol | No | Protocol label (http or socks5) echoed into json output. It does not change the proxies themselves — every plan serves HTTP, HTTPS, and SOCKS5 on the same host and port. |
The targeting and session parameters follow the same plan-support rules as building usernames by hand — see Targeting for what each plan supports.
Supported format values:
host:port:username:password(default)host:portusername:password@host:porthttp://username:password@host:portsocks5://username:password@host:portjsoncsv
Example
curl "https://proxyomega.com/api/v1/proxy-list?api_key=YOUR_API_KEY&type=platinum&quantity=3&country=us&sticky=true"
Default output is plain text, one proxy per line:
platinum.proxyomega.com:20228:USERNAME-country-us-session-4f8a1c2b:PASSWORD
platinum.proxyomega.com:20228:USERNAME-country-us-session-9d3e7a51:PASSWORD
platinum.proxyomega.com:20228:USERNAME-country-us-session-b6c04e92:PASSWORD
With format=json the same list is wrapped in a JSON envelope (abridged):
{
"success": true,
"data": {
"proxies": [
{
"host": "platinum.proxyomega.com",
"port": 20228,
"username": "USERNAME-country-us-session-4f8a1c2b",
"password": "PASSWORD",
"protocol": "http",
"type": "platinum"
}
],
"count": 1,
"type": "platinum"
}
}
Errors: 401 {"success": false, "error": "Invalid API key"} for a missing or invalid key, 403 {"error": "No active subscriptions"} when your account has no active plans, and 404 {"error": "Proxy type not found"} when the requested type is not active on your account.
Whitelist management
These endpoints manage the IP allowlist used for credential-free proxy connections. All of them authenticate with the bearer token.
Each entry has a proxy_type scoping which product it applies to: global (all products), unlimited, platinum, ipv6, mobile, or isp.
| Method | Path | Purpose |
|---|---|---|
GET | /api/proxy/whitelist | List whitelist entries |
POST | /api/proxy/whitelist/add | Add one IP |
POST | /api/proxy/whitelist/add-bulk | Add multiple IPs |
DELETE | /api/proxy/whitelist/remove | Remove an entry |
POST | /api/proxy/whitelist/remove-bulk | Remove multiple entries |
POST | /api/proxy/whitelist/update | Edit an entry's IP or label |
GET /api/proxy/whitelist
Returns your whitelist entries. Filter by product with the optional type query parameter (same values as proxy_type above).
curl "https://proxyomega.com/api/proxy/whitelist?type=global" \
-H "Authorization: Bearer YOUR_TOKEN"
{
"success": true,
"message": "Whitelist retrieved successfully",
"status_code": 200,
"timestamp": "2026-07-10T09:00:00+00:00",
"data": {
"whitelist": [
{
"id": 101,
"user_id": 12345,
"ip_address": "203.0.113.7",
"proxy_type": "global",
"label": "Office",
"created_at": "2026-07-01 09:30:00"
}
],
"count": 1,
"max_allowed": 50
}
}
POST /api/proxy/whitelist/add
Adds one IP. JSON body: ip_address (required), proxy_type (required), label (optional).
curl -X POST https://proxyomega.com/api/proxy/whitelist/add \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ip_address": "203.0.113.7", "proxy_type": "global", "label": "Office"}'
{
"success": true,
"message": "IP added to whitelist successfully",
"status_code": 200,
"timestamp": "2026-07-10T09:00:00+00:00",
"data": {
"id": 101,
"ip_address": "203.0.113.7",
"proxy_type": "global",
"label": "Office"
}
}
Invalid IPs, duplicates, and requests that would exceed the 50-IP limit return 422.
POST /api/proxy/whitelist/add-bulk
Adds several IPs in one call. JSON body: ip_addresses (array of IP strings), proxy_type (required), label (optional). The response reports how many were added, how many were already on the list, and which values were invalid (abridged):
{
"success": true,
"message": "Added 2 IP(s) to whitelist. 1 duplicate(s). 0 failed.",
"status_code": 200,
"timestamp": "2026-07-10T09:00:00+00:00",
"data": {
"added": 2,
"duplicates": 1,
"failed": 0,
"invalid_ips": []
}
}
success is true only if at least one IP was added. A batch that would push the list past 50 IPs returns 422.
DELETE /api/proxy/whitelist/remove
Removes one entry by its id (from the list endpoint). POST to the same path is also accepted.
curl -X DELETE https://proxyomega.com/api/proxy/whitelist/remove \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"id": 101}'
{
"success": true,
"message": "IP removed from whitelist successfully",
"status_code": 200,
"timestamp": "2026-07-10T09:00:00+00:00"
}
Returns 404 if the entry does not exist and 403 if it belongs to another account.
POST /api/proxy/whitelist/remove-bulk
Removes several entries in one call. JSON body: ids (array of entry ids). The response reports the per-entry result in the same envelope as the other whitelist endpoints.
POST /api/proxy/whitelist/update
Edits an existing entry. JSON body: id (required), ip_address (required), label (optional). Returns 422 if the new IP is already whitelisted on another entry, 404 if the entry does not exist, and on success:
{
"success": true,
"message": "Whitelist entry updated successfully",
"status_code": 200,
"timestamp": "2026-07-10T09:00:00+00:00"
}
API key
GET /api/user/api-key
Returns your current API key. Bearer-token auth.
curl https://proxyomega.com/api/user/api-key \
-H "Authorization: Bearer YOUR_TOKEN"
{
"api_key": "a1b2c3-d4e5f6-a7b8c9-d0e1f2-a3b4c5"
}
POST /api/user/api-key/generate
Generates a new API key, replacing the old one. POST only; other methods return 405.
curl -X POST https://proxyomega.com/api/user/api-key/generate \
-H "Authorization: Bearer YOUR_TOKEN"
{
"success": true,
"api_key": "f6e5d4-c3b2a1-f0e9d8-c7b6a5-f4e3d2",
"message": "API key generated successfully"
}
Subscriptions
GET /api/user/subscriptions
Returns the subscriptions on your account. Bearer-token auth.
curl https://proxyomega.com/api/user/subscriptions \
-H "Authorization: Bearer YOUR_TOKEN"
Abridged example response:
{
"success": true,
"status_code": 200,
"timestamp": "2026-07-10T09:00:00+00:00",
"subscriptions": [
{
"id": 4211,
"product_type": "unlimited",
"status": "active",
"plan_name": "Budget Unlimited",
"billing_interval": "monthly",
"ports": 25,
"default_port": 10000,
"auto_renew": true,
"date_purchased": "2026-06-14 18:02:11",
"date_expiry": "2026-07-14 18:02:11",
"can_renew": true,
"cancel_at_period_end": false
},
{
"id": "platinum_12345",
"product_type": "platinum",
"billing_interval": "gb_pack",
"bandwidth_gb": 8.4
}
],
"count": 2
}
Fields you can rely on per subscription: id, product_type (unlimited, premium_unlimited, platinum, mobile, ipv6), status, auto_renew, date_purchased, date_expiry, ports, threads, quantity, plan_name, billing_interval, actual_price, next_renewal_price, has_active_discount, can_renew, cancel_at_period_end, and (Budget Unlimited only) default_port, your lowest connect port.
Pay-as-you-go balances (Platinum and Mobile GB packs) appear as summary rows with billing_interval "gb_pack" and a bandwidth_gb / data_gb balance rather than as dated subscriptions. The response may include additional fields; treat anything not listed here as internal and subject to change.
Session API (Budget Unlimited)
Budget Unlimited ports expose a small session API for checking which exit IP a port (or sticky session) currently holds, and for forcing a rotation on demand. You can call it two ways: directly through the proxy with your proxy credentials, or through the account endpoints with the bearer token. See Sessions & rotation for how sessions and rotation intervals work.
Calling it through the proxy
Send a plain-HTTP request to http://api.proxyomega.com/v1/... through your Budget Unlimited proxy port, authenticating exactly as you would for normal traffic. There are no query parameters — what you get back is selected by how you connect: the port you connect to selects the port, and a -session-<id> tag in your username selects that sticky session. A -country-<cc> tag is echoed back as country_requested.
http://, not https:// — HTTPS requests to the session API fail with a 502. Use HTTP proxy mode (as in the curl examples below) rather than SOCKS5 for these calls.GET /v1/session
Returns the current session for the port (and session tag) you connect as.
curl -x "http://USERNAME:[email protected]:10000" \
http://api.proxyomega.com/v1/session
{
"user_id": 12345,
"port": 10000,
"session_id": null,
"country_requested": null,
"rotation_minutes": 4,
"next_rotation_at": "2026-07-10T09:43:07Z",
"proxy": {
"online": true,
"device_id": "3f9c2a71-8a4e-4b0f-9d2c-5e1a7b6c4d38",
"ip": "198.51.100.24",
"country": "US",
"city": "Phoenix",
"state": "Arizona",
"isp": "ExampleNet",
"asn": 64500
},
"fetched_at": "2026-07-10T09:39:11Z"
}
To inspect a specific sticky session, connect exactly as that session would — for example username USERNAME-session-abc123 on the same port. A freshly created or just-rotated session shows "online": false with null proxy fields until your next real request through the port assigns an IP; that is expected, not an error. device_id is an opaque identifier for your current assignment — include it in support tickets if you report a problem with a specific IP.
GET /v1/sessions
Returns every active assignment across all of your ports and sessions, whichever port you call it through. Ports and sessions that do not currently hold an IP are not listed.
curl -x "http://USERNAME:[email protected]:10000" \
http://api.proxyomega.com/v1/sessions
{
"user_id": 12345,
"sessions": [
{
"port": 10000,
"session_id": null,
"country_requested": null,
"rotation_minutes": 4,
"next_rotation_at": "2026-07-10T09:43:07Z",
"proxy": {
"online": true,
"device_id": "3f9c2a71-8a4e-4b0f-9d2c-5e1a7b6c4d38",
"ip": "198.51.100.24",
"country": "US",
"city": "Phoenix",
"state": "Arizona",
"isp": "ExampleNet",
"asn": 64500
}
}
],
"fetched_at": "2026-07-10T09:39:11Z"
}
POST /v1/session/rotate
Drops the current IP for the port (and session tag) you connect as. The response echoes the assignment you just dropped in previous (null if there was none); a fresh IP is assigned on your next real request through the port.
curl -X POST \
-x "http://USERNAME:[email protected]:10000" \
http://api.proxyomega.com/v1/session/rotate
{
"status": "rotated",
"user_id": 12345,
"port": 10000,
"session_id": null,
"previous": {
"device_id": "3f9c2a71-8a4e-4b0f-9d2c-5e1a7b6c4d38",
"ip": "198.51.100.24",
"country": "US",
"city": "Phoenix",
"state": "Arizona",
"asn": 64500,
"isp": "ExampleNet"
},
"note": "next request through this proxy port will be assigned a fresh device",
"fetched_at": "2026-07-10T09:45:02Z"
}
Dashboard-token variant
The same data is available from the account API with the bearer token:
| Method | Path | Purpose |
|---|---|---|
GET | /api/proxy/session-info?port=10000 | Session for one connect port. Without port, returns a JSON array covering every active Budget Unlimited port. |
GET | /api/proxy/session-info-all | Same as session-info without port. |
POST | /api/proxy/rotate | Rotate a port. port is required, as a JSON body {"port": 10000}, form field, or query parameter. |
curl "https://proxyomega.com/api/proxy/session-info?port=10000" \
-H "Authorization: Bearer YOUR_TOKEN"
curl -X POST https://proxyomega.com/api/proxy/rotate \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"port": 10000}'
The port value is one of your Budget Unlimited connect ports as shown on the dashboard. Responses carry the same fields as the /v1/session and /v1/session/rotate shapes above. POST /api/proxy/rotate rotates the port's base assignment (no session tag); to rotate one specific sticky session, use the proxy-side POST /v1/session/rotate with the -session- tagged username.
A port that is not an active Budget Unlimited port on your account returns 404 with message "Port not found"; rotate without a port returns 400 "Port is required". In batch responses, ports that could not be queried appear inline as {"port": N, "error": "session_info_unavailable", "detail": "..."}.
Poll session info at sensible intervals — a few times per minute is plenty, since assignments do not change faster than your rotation interval.
Errors
Most account endpoints wrap errors in a common envelope:
{
"success": false,
"message": "What went wrong",
"status_code": 422,
"timestamp": "2026-07-10T09:00:00+00:00"
}
Check success (or the HTTP status) before reading the payload. Status codes you will encounter:
| Status | When | Notes |
|---|---|---|
400 | Required parameter missing | For example, rotate without a port: "Port is required". |
401 | Missing or invalid credentials | Bearer endpoints: "Authentication required - no token" or "Invalid or expired token". Proxy-list: {"success": false, "error": "Invalid API key"}. |
403 | Not yours, or not available | The resource belongs to another account, or (proxy-list) {"error": "No active subscriptions"}. |
404 | Not found | Unknown port, whitelist entry, or a plan type that is not active on your account. |
405 | Wrong HTTP method | For example, GET on a POST-only endpoint. |
422 | Validation failed | Invalid IP format, duplicate whitelist entry, or over the 50-IP limit. |
503 | Session info temporarily unavailable | {"error": "session_info_unavailable", "detail": "..."} — retry after a short wait. |
The Session API called through the proxy has its own small set:
| Status | When | Body |
|---|---|---|
404 | Unknown path under /v1/ | {"error": "not found", "path": "/v1/..."} |
407 | Wrong proxy credentials | Empty body. |
502 | Request sent over https:// | Use http:// for session-API URLs. |
What is not covered
This page documents the stable, supported surface of the Public API. Other /api/... paths you may notice in dashboard network traffic are internal and can change without notice — don't build against them. Usage and bandwidth reporting endpoints are not part of the public surface yet. If you need something programmatically that isn't documented here, email [email protected].
Looking for sub-accounts?
If you resell proxies and need to provision sub-accounts, provision subscriptions on behalf of others, and pull per-account analytics, use the separate Reseller API. It has its own base URL and its own authentication, and it requires an approved reseller account.
Last updated July 10, 2026