Reseller API
Buy proxies, manage orders, and check your account - all over REST. Keys are per-reseller and rate limited at 1000 req/hour.
https://catproxies.com/api/v1/publicHow our reseller model works. You sell from the catalogue we assign to your account - not an open pool. Your /store lists exactly the packages an admin has enabled for you, each at the reseller price we set. Every order is paid from your prepaid balance. So your whole API surface is: read your store, buy a package, get credentials, manage and extend. There is nothing to provision or configure beyond that.
Product types
Every product in /store has a proxyType value. Use that exact value to filter the store (?proxyType=) and to tell which product an order is. This table maps each product name to its value.
| Product | proxyType value | Type |
|---|---|---|
| Standard Residential | gResidential | Bandwidth |
| Premium Residential | resix | Bandwidth |
| Unlimited Residential | UnlimitedResidential | Speed-capped (unlimited data) |
| Static ISP | Isp | Per-IP (country) |
| Dedicated ISP | IspP | Per-IP (no country) |
| Datacenter | DatacenterP | IPs + bandwidth pool |
| IPv6 | Ipv6p | Bandwidth or unlimited |
| Rotating Mobile | RotatingMobile | Bandwidth |
Quick start
# 1. See what you can sell (and your price)
curl -H "Authorization: Bearer cp_your_api_key_here" \
https://catproxies.com/api/v1/public/store
# 2. Buy a package (paid from your balance)
curl -X POST https://catproxies.com/api/v1/public/order \
-H "Authorization: Bearer cp_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{ "packageId": "PACKAGE_ID_FROM_STORE" }'
# 3. Read the credentials back any time
curl -H "Authorization: Bearer cp_your_api_key_here" \
https://catproxies.com/api/v1/public/order/ORDER_ID
# -> proxyCredentials: { username, password, hostip, port, ... }Authentication
API Key Format
API keys are prefixed with cp_ followed by 64 hexadecimal characters.
cp_a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2w3x4y5z6a7b8c9d0e1f2Using Your API Key
Include your API key in the Authorization header using the Bearer scheme:
curl -X GET https://catproxies.com/api/v1/public/account \
-H "Authorization: Bearer cp_your_api_key_here"Rate Limits
1000 requests per hour per API key, reset at the top of each hour.
Mobile Targeting endpoints have a separate shared bucket: 60 requests per 10 minutes across all 4 mobile targeting sub-endpoints per API key. Cache responses where possible.
Check your current rate limit usage via the /account endpoint:
{
"rateLimits": {
"requestsPerHour": 1000,
"requestsUsed": 47,
"requestsRemaining": 953,
"resetAt": "2025-11-29T21:00:00.000Z"
}
}Rotating Mobile - targeting endpoints
Need all countries, regions, cities, and ISPs at once? Download the full offline snapshot instead of hitting these endpoints repeatedly.
Static ISP Proxies - Quick Guide
ISP proxies use per-IP pricing. The resellerPrice in /store is the price per single IP. Your total = resellerPrice × quantity.
Complete ISP workflow
# 1. List ISP packages - note resellerPrice (per IP), minQty, maxQty, locations[]
GET /api/v1/public/store?proxyType=Isp
# 2. Buy 5 IPs in the US (countryId from locations[].id)
POST /api/v1/public/order
{ "packageId": "...", "ispData": { "quantity": 5, "countryId": 1 } }
# Charged: resellerPrice × 5
# 3. Get the proxy lines (host / ports / login / password per IP)
GET /api/v1/public/order/{orderId}/proxies
# 4. Check extend cost (resellerPrice × 5 for another 30 days)
GET /api/v1/public/order/{orderId}/extendOptions
# 5. Extend - packageId is optional for ISP
POST /api/v1/public/order/{orderId}/extend
{}
# Charged: resellerPrice × 5 again| Field | Notes |
|---|---|
ispData.quantity | Defaults to 1 if omitted. Must be ≥ minQty and ≤ maxQty from the store product. |
ispData.countryId | Defaults to the first location if omitted. Use locations[].id from the store product. |
ispData.authMethod / authIp | Optional IP authentication. "ip" + a single IPv4 (authIp) whitelists that IP so the proxies work with no username/password. Fixed at purchase; GET /order/:id echoes it back as auth_mode + whitelist_ip. |
Extend packageId | Optional for ISP - the API resolves the package from the order automatically. Pass {} as the body. |
extendType | "days" for ISP (adds one full period). "bandwidth" for Residential/Mobile. |
Extend cost | resellerPrice × order.package_ips (same quantity as the original purchase). |
Dedicated ISP - Quick Guide
Dedicated ISP (proxyType: IspP) is a per-IP product: order any quantity from 1 to 100 IPs at a flat resellerPrice per IP (total = resellerPrice × quantity). Unlike Standard ISP it is pool-based (no country to pick), the term is a fixed 30 days, and it is username:password only. Each IP is a dedicated line served from GET /order/:id/proxies.
Complete Dedicated ISP workflow
# 1. List Dedicated ISP packages - note resellerPrice (per IP). locations[] is
# EMPTY (pool-based, no country). Any quantity 1-100 costs the same per IP.
GET /api/v1/public/store?proxyType=IspP
# 2. Buy 5 IPs - pass ONLY the quantity (no countryId, no authMethod).
POST /api/v1/public/order
{ "packageId": "...", "ispData": { "quantity": 5 } }
# Charged: resellerPrice × 5. Term: a fixed 30 days.
# 3. Get the proxy lines (host / port / login / password per IP).
# Normally ready immediately; if you get HTTP 202 { pending: true }, retry
# in a few seconds.
GET /api/v1/public/order/{orderId}/proxies
# 4. Check the renewal cost (resellerPrice × 5 for another 30 days).
GET /api/v1/public/order/{orderId}/extendOptions
# 5. Renew - packageId is resolved from the order, so send an empty body.
POST /api/v1/public/order/{orderId}/extend
{}
# Charged: resellerPrice × 5 again, +30 days.Connecting
Each line from /order/:id/proxies is one dedicated proxy with its own login/password. The same port (port_http = port_socks) serves HTTP, SOCKS5 and UDP-over-SOCKS5. There is no gateway host and no username-appended targeting.
http://<login>:<password>@<host>:<port> # HTTP / HTTPS
socks5://<login>:<password>@<host>:<port> # SOCKS5 (UDP supported)| Field | Notes |
|---|---|
ispData.quantity | Number of IPs, 1-100. Flat per-IP price across the whole range. Defaults to 1 if omitted - always send it explicitly. |
ispData.countryId | Not used. Dedicated ISP is pool-based; locations[] is empty and any value sent is ignored. |
ispData.authMethod / authIp | Not supported - Dedicated ISP is username:password only. IP authentication is Static ISP only. |
Term | Fixed 30 days. Not selectable. |
Credentials | Not on GET /order/:id. Fetch the host:port:login:password lines from GET /order/:id/proxies. |
Provisioning | GET /order/:id/proxies may return HTTP 202 { pending: true, proxies: [] } for a few seconds after purchase; retry. stale: true = served from cache during a brief upstream blip, lines still valid. |
Subnet plans | A /24 block (isSubnet: true) is NOT buyable via the API (returns 400); arrange subnets with support. |
Renewal | POST /order/:id/extend with {}. Cost = resellerPrice × the order IP count, for another fixed 30 days. Not idempotent - serialize renew calls per order. |
Manual review (rare) | If a charged order needs manual review you get an error saying so. The charge stands - do NOT auto-retry POST /order (a retry makes a new order + new charge). If the upstream simply refused the order, nothing is charged and your balance is refunded automatically. |
Standard Residential - Quick Guide
Standard Residential (proxyType: gResidential) is a bandwidth product. Buy and extend it with just the packageId - no extra body fields. Geo and session targeting are appended to the username, so one set of credentials covers every country and session. Rotating IP per request by default.
Connection ports
Use the host from GET /order/:id (proxyCredentials.hostip). Pick the port for the protocol and rotation you want.
| Protocol | Rotating port | Sticky port |
|---|---|---|
| HTTP / HTTPS | 9000 | 10000 |
| SOCKS5 | 11000 | 12000 |
Targeting - append to the username
Keep the password as-is and append flags to the username. -type-residential is required; the rest are optional.
| Target | Flag | Value format |
|---|---|---|
| Type (required) | -type-residential | always include this |
| Country | -country-us | ISO-2 code, lowercase |
| State / region | -state-california | lowercase |
| City | -city-losangeles | lowercase, no spaces |
| ASN / carrier | -asn-7922 | ASN number only |
| Sticky session | -lifetime-30-session-ab12 | minutes (max 1440) + any id |
Add -lifetime-<minutes>-session-<id> to hold the same exit IP (lifetime up to 1440 minutes = 24h); omit the sticky flags for a fresh IP on every request. Discover valid countries, cities and ASNs with GET /gresi-targeting-options?orderId=... (see the Targeting endpoints).
Example
# Credentials from GET /order/:id
# username: mtpeqbcevnemewc201120 password: jonxybfeuu
# host: HOST (proxyCredentials.hostip)
# Rotating IP in the US (new IP per request) - HTTP port 9000
curl -x HOST:9000 \
-U "mtpeqbcevnemewc201120-type-residential-country-us:jonxybfeuu" \
https://ipinfo.io
# Sticky IP in Los Angeles for 30 minutes - sticky HTTP port 10000
curl -x HOST:10000 \
-U "mtpeqbcevnemewc201120-type-residential-country-us-state-california-city-losangeles-lifetime-30-session-ab12:jonxybfeuu" \
https://ipinfo.io| Feature | Notes |
|---|---|
Targeting reference | GET /gresi-targeting-options?orderId=... returns the available countries, cities and ASNs for the order. |
City / state name lists | The endpoint above returns the exact set for your order. For a ready-made list of city and US-state name tokens (same lowercase, no-separator format), download the Premium Residential targeting reference - its cities / us_states / us_state_cities lists apply here too. |
Usage analytics | GET /order/:id/usage-stats returns request volume, success rate, bandwidth over time and top destination hosts/countries. |
Rotate password | POST /order/:id/reset-password issues a new base password (old one stops immediately; new one activates in 1-2 minutes). Re-append your targeting flags to the new password. |
IP whitelist | PATCH / DELETE / GET /order/:id/whitelist add, remove and list IPv4 addresses that can use the proxy without username:password. |
Extending | Adds bandwidth. GET /order/:id/extendOptions returns your bandwidth packs (extendType "bandwidth"); POST /order/:id/extend with the chosen packageId. |
Premium Residential - Quick Guide
Premium Residential is a bandwidth product. Buy and extend it exactly like Standard Residential - no extra body parameters. Geo, session and optional quality filters are appended to the password, so a single set of credentials covers every country, session and mode. HTTP and SOCKS5 are both supported.
Connection endpoints
GET /order/:id returns proxyCredentials.hostip / port (the Americas HTTP gateway IP by default) plus an endpoints object with the ip:port for every region and protocol. The host is always the IP from your order; pick the endpoint whose region matches your target country, on HTTP or SOCKS5, using the ports below.
| Region | HTTP port | SOCKS5 port |
|---|---|---|
| Americas | 6011 | 6014 |
| Europe | 6012 | 6015 |
| Asia / Africa / Oceania | 6013 | 6016 |
Targeting - append to the password
Keep the username as-is and append flags to the password. The first flag joins the password with a - and every flag after it with a _. All flags are optional — a bare password returns a worldwide IP.
| Target | Flag | Value format |
|---|---|---|
| Country | country-us | ISO-2 code, lowercase. Optional — omit for worldwide. |
| US state | state-california | state name, lowercase, no spaces (newyork). US only. |
| City | city-losangeles | lowercase, no spaces or separators. Not with a state. |
| Sticky session | session-a1b2c3d4 | exactly 8 lowercase letters/digits. One id = one IP. |
| Session lifetime | lifetime-1h | how long the sticky IP is held, up to 168h. |
| Quality filter | streaming-1 | best-effort cleaner IPs. |
| Speed filter | direct-1 | best-effort lower latency. |
| Auth filter | skipispstatic-1 | best-effort fewer blocks. |
How the flags combine
- First flag uses
-, the rest use_- e.g.-country-gb_city-london_session-a1b2c3d4_lifetime-1h. - City and state are mutually exclusive, and both require a country. Use one or the other, never both.
- Multi-word cities/states have no spaces or separators -
city-losangeles,state-newyork. - Rotating vs sticky. No
_session-= a fresh IP per request. Add a unique 8-char_session-<id>(optionally_lifetime-<up to 168h>) to hold one IP; one line per unique id = a batch of different sticky IPs. - The optional filters (
streaming-1,direct-1,skipispstatic-1) are best-effort optimisations, not guarantees. Stacking several can lower availability - use only the one you need.
A sticky session id (exactly 8 lowercase letters/digits) maps to one exit IP, held on a best-effort basis for the lifetime you set (up to 168h). Omit the session for a fresh IP on every request; use a unique id per proxy line to get a batch of different sticky IPs.
Rotating the password
POST /order/:id/reset-password issues a brand-new password for the order (see the Endpoints section). Because targeting flags are appended to the password, a reset changes the base password only - rebuild your proxy strings with the new base password and re-append the same flags. The old password stops working immediately and the new one takes 1 to 2 minutes to activate.
Country, state & city lists
Country is an ISO-2 code (lowercase). Cities and US states are the plain name in lowercase with no spaces or separators (losangeles, newyork). The downloadable reference includes the full country, city and US-state name lists (the exact tokens our own dashboard uses) plus all ports and flag formats. Cities are grouped by country (cities), US states are in us_states, and US cities per state are in us_state_cities. A token can still return 503 if that place has no live IP at the moment - just broaden the targeting.
Premium Residential targeting reference (JSON)
196 countries, full city & US-state name lists, all ports, and every flag format.
Tip: any city in the world can be requested, but because the residential pool is dynamic, very small cities may fall back to the wider region. Prefer larger cities. If a request returns no IP, broaden the targeting.
Example
# Credentials from GET /order/:id (HOST = your order's hostip - a plain
# unbranded IP; per-region HTTP/SOCKS5 ports are in the endpoints object)
# username: hftjvbtwgxxxceb205604
# password: ngnstzylne
# Americas HOST:6011 Europe HOST:6012 Asia HOST:6013
# Worldwide, rotating (bare password = a fresh IP on every request)
curl -x HOST:6011 -U "hftjvbtwgxxxceb205604:ngnstzylne" http://ip-api.com/json
# -> {"status":"success","country":"Brazil","city":"Itapetininga","isp":"Fernanda Cristina Ruiz Matiazzo - ME","query":"170.245.17.156"}
# UK, city London, with the Quality filter (use the Europe endpoint)
curl -x HOST:6012 \
-U "hftjvbtwgxxxceb205604:ngnstzylne-country-gb_city-london_streaming-1" \
http://ip-api.com/json
# -> {"status":"success","country":"United Kingdom","city":"Isleworth","isp":"Vodafone BB","query":"62.49.108.249"}
# A DIFFERENT sticky IP per line: give each line its own unique 8-char session
curl -x HOST:6011 -U "hftjvbtwgxxxceb205604:ngnstzylne-country-us_session-a1b2c3d4_lifetime-1h" http://ip-api.com/json
curl -x HOST:6011 -U "hftjvbtwgxxxceb205604:ngnstzylne-country-us_session-e5f6g7h8_lifetime-1h" http://ip-api.com/json
# SOCKS5 works too - just use the region's SOCKS5 port
curl -x socks5h://HOST:6014 -U "hftjvbtwgxxxceb205604:ngnstzylne-country-us" http://ip-api.com/jsonUnlimited Residential - Quick Guide
Unlimited Residential (proxyType: UnlimitedResidential) is a speed-based product: unlimited bandwidth, with the plan capped by throughput (Mbps) instead of GB. Buy it with the packageId plus a gateway_server id (from GET /servers). Geo and session targeting are appended to the username, so one set of credentials covers every country and session. Rotating IP per request by default. HTTP and SOCKS5 are both supported.
Connection ports
Use the host from GET /order/:id (proxyCredentials.hostip - each plan has its own gateway). Pick the port for the protocol you want.
| Protocol | Port |
|---|---|
| HTTP / HTTPS | 8080 |
| SOCKS5 | 1080 |
Targeting - append to the username
Keep the password as-is and append flags to the username. All flags are optional - a bare username returns a worldwide rotating IP.
| Target | Flag | Value format |
|---|---|---|
| Country | -country-US | ISO-2 code (uppercase). Omit for worldwide. |
| State / region | -state-ca | ISO 3166-2 subdivision code, lowercase (the part after the hyphen) - length varies: ca, ny (US); by, sn (DE); 82 (IT); idf (FR); eng (GB). Pair with a country. |
| City | -city-losangeles | lowercase, no spaces or separators (los_angeles is wrong, use losangeles). |
| ASN / carrier | -asn-7018 | ASN number only. |
| Sticky session | -session-482913-ttl-1800 | numeric id + ttl in seconds (hold time). |
Omit the -session-... flag for a fresh IP on every request. Add -session-<id>-ttl-<seconds> to hold the same exit IP for the given number of seconds; use a unique id per proxy line for a batch of different sticky IPs. State, city and ASN draw from a live pool whose coverage shifts over time - if a request returns no IP, that spot is momentarily empty, so broaden the targeting (drop the city, then the state). Country-only always works.
Example
# Credentials from GET /order/:id
# username: PbSI5fsWPI password: <your-password>
# host: HOST (proxyCredentials.hostip)
# Rotating IP in the US (new IP per request) - HTTP port 8080
curl -x HOST:8080 \
-U "PbSI5fsWPI-country-US:PASSWORD" \
https://ipinfo.io
# Sticky IP in Los Angeles held for 30 minutes (1800s) - HTTP port 8080
curl -x HOST:8080 \
-U "PbSI5fsWPI-country-US-state-ca-city-losangeles-session-482913-ttl-1800:PASSWORD" \
https://ipinfo.io
# SOCKS5 works too - use port 1080
curl -x socks5h://HOST:1080 -U "PbSI5fsWPI-country-US:PASSWORD" https://ipinfo.io| Feature | Notes |
|---|---|
Buying | POST /order with the packageId and a gateway_server id (the numeric id from GET /servers - see the Store & Products endpoints). |
Rotate password | POST /order/:id/reset-password issues a new 16-character password (old one stops immediately; new one activates in 1-2 minutes). Targeting flags live on the username, so only swap the new password into your proxy strings - nothing else changes. |
Usage analytics | GET /order/:id/unlimited-metrics returns live speed, CPU/RAM, lifetime data used and a bandwidth/request time-series (see the Analytics query block below). |
Speed cap | Higher plans allow higher throughput (Mbps). There is no data cap and no GB tracking - usage is null on the order. |
Renewal | Unlimited Residential plans are fixed-term and are NOT auto-renewable via the API (extendOptions returns an empty list). When a plan expires, buy a fresh one with POST /order. |
Analytics - GET /order/:id/unlimited-metrics
Read-only. All params are optional; invalid timeframe / interval values fall back to the defaults silently (no error), so validate against the lists below. interval only affects the overview series.
| Param | Values | Notes |
|---|---|---|
view | overview (default) | activity | top-domains | Which dataset to return. |
timeframe | 1hour | 6hours | 1day | 1week | 1month | 3months | Default 1day. Note 6hours is plural. |
interval | 5min | 30min | 1hour | 6hour | 1day | 1week | 1month | Default 1hour. Overview series bucket size. Note 6hour is singular. |
page | integer, from 1 | activity only. 100 rows per page (fixed); top-domains returns the top 50 (no paging). |
Response shapes by view:
# view=overview (default)
payload: {
metrics: {
speed: { "<proxy-username>": { bits_per_second, formatted_speed }, ... },
server: { cpu_usage, ram_usage }, // percentages
bandwidth: { used } // lifetime bytes
},
series: [ { timestamp, downloaded_gb, uploaded_gb, total_gb, requests, success_rate } ],
timeframe, interval,
available // false = stats backend temporarily down
}
# view=activity (paginated recent connections)
payload: {
activity: [ { timestamp, domain, outcome, protocol,
downloaded_bytes, uploaded_bytes, duration_ms, client_ip } ],
pagination:{ total, per_page, current_page, last_page },
available
}
# outcome is one of: SUCCESS | ERROR | DOMAIN_BLOCKED | UDP
# view=top-domains (destinations ranked by request volume, top 50)
payload: {
topDomains:[ { domain, requests, success_rate, total_bandwidth,
total_downloaded, total_uploaded, avg_duration_ms } ],
summary,
available
}Live speed is reported per proxy sub-account (keyed by username) - sum bits_per_second across the accounts for the plan's current throughput. Byte and GB figures in the series are per bucket; totals are yours to sum.
Datacenter - Quick Guide
Datacenter plans (proxyType: DatacenterP) give you a list of dedicated IPs plus a shared bandwidth pool for a fixed duration - e.g. 100 IPs / 250 GB / 30 days. At purchase you decide how the IPs split across US, CA, DE, GB and NL. Every IP is its own proxy; they all share the same username:password. Each IP works two ways: static (that exact IP every time) or rotating (a new IP on every request) by adding a -ttl-0 flag to the username.
Complete Datacenter workflow
# 1. List Datacenter packages - note ips (IP count), bandwidth (GB pool), days
GET /api/v1/public/store?proxyType=DatacenterP
# 2. Check live IP stock per country before allocating
GET /api/v1/public/datacenterp-countries
# 3. Buy - country_proxies must total EXACTLY the package IP count
POST /api/v1/public/order
{
"packageId": "...",
"datacenterPData": {
"country_proxies": { "US": 60, "DE": 20, "GB": 20 },
"high_concurrency": false,
"high_priority": false,
"whitelisted_ips": false
}
}
# 4. Read the IP list back (ip_list is refreshed live on every call)
GET /api/v1/public/order/{orderId}
# 5. Optional - whitelist your server IP for credential-less access
PATCH /api/v1/public/order/{orderId}/whitelist
{ "ip": "203.0.113.42" }What GET /order/:id returns for Datacenter
{
"payload": {
"order": {
"id": "c5c7c6b5-e488-420c-b436-e90e86031751",
"package_title": "Datacenter Proxies - 1 Month - 100 IPs - 250GB",
"status": "CONFIRMED",
"proxyCredentials": {
"username": "dcuser482913",
"password": "dcpass91827",
"total_bandwidth": 250,
"used_bandwidth": 12.4,
"bandwidth_left": 237.6,
"available_bandwidth": 237.6,
"expired_at": "2026-08-04T10:00:00.000Z",
"port_http": "1338",
"port_socks5": "1339",
"whitelist_ip": [],
"ip_list": [
{
"iso2": "US",
"name": "United States",
"cities": [
{ "ips": ["203.0.113.24", "203.0.113.57", "..."] }
],
"count_ips": 60
},
{ "iso2": "DE", "name": "Germany", "cities": ["..."], "count_ips": 20 }
],
"country_list": {
"countries": { "US": 60, "DE": 20, "GB": 20 },
"proxyNumber": 100
}
}
}
}
}Using the proxies
# Every IP in ip_list is a dedicated proxy. Same credentials on all of them.
# HTTP: <ip>:1338:<username>:<password>
# SOCKS5: <ip>:1339:<username>:<password>
# STATIC - that exact IP every time
curl -x 203.0.113.24:1338 -U "dcuser482913:dcpass91827" https://ipinfo.io
# ROTATING - a new IP on every request: append -ttl-0 to the USERNAME on any of
# your IPs. That IP then rotates within its own country.
curl -x 203.0.113.24:1338 -U "dcuser482913-ttl-0:dcpass91827" https://ipinfo.io
# After whitelisting your server IP, credentials are optional (static only):
curl -x 203.0.113.24:1338 https://ipinfo.io| Field | Notes |
|---|---|
country_proxies | Must total exactly the package ips value. Allowed countries: US, CA, DE, GB, NL. Check /datacenterp-countries for live stock first - over-allocating a country fails the purchase. |
Addons | high_concurrency (more parallel connections), high_priority (priority routing), whitelisted_ips (3 whitelist slots instead of 1). Each addon enabled adds +25% to the plan price (e.g. all three = +75%). All three are booleans and must be present in datacenterPData. |
Bandwidth | One shared GB pool across all IPs in the plan. Track it via bandwidth_left on GET /order/:id (refreshed live). |
ip_list | Grouped by country then city. Flatten cities[].ips to get every proxy IP. Refreshed live on each GET /order/:id. |
Authentication | username:password on any IP, or whitelist your server IP (PATCH /order/:id/whitelist) and connect without credentials. |
Rotate password | POST /order/:id/reset-password issues a new 12-character password shared by every IP (old one stops immediately; new one activates in 1-2 minutes). Only the password changes - swap it into all your proxy strings. |
Rotating IPs | Append -ttl-0 to the username on any IP for a new IP on every request (it rotates within that IP's country); omit it for a fixed IP. For a single worldwide-rotating endpoint that blends all your countries into one line, set up your own white-label gateway domain - contact us for the setup details. |
HTTP 429 | Returned by the proxy when you hit the plan’s concurrent-connection limit - lower parallelism, or buy with the high_concurrency addon for a higher limit. 407 = wrong credentials / non-whitelisted IP. |
Extending | Not supported - /order/:id/extendOptions returns an empty list. Buy a new package when the plan expires or the bandwidth pool runs out. |
IPv6 - Quick Guide
IPv6 plans (proxyType: Ipv6p) rotate through a huge pool of IPv6 addresses - a fresh exit IP on every request by default. Two plan flavors in /store: bandwidth plans (GB pool, no speed cap) and unlimited plans (bandwidth "0" = no GB cap, speed capped at the speed value in Mbps). Purchase needs only the packageId - no extra body fields.
Connection gateways
IPv6 is served through country gateways - the exit country is chosen by which gateway you connect to, and the same username:password works on all of them. Locations: Worldwide, United States, Germany, United Kingdom, Netherlands. Ports: 1338 HTTP/HTTPS, 1339 SOCKS5.
The gateway addresses are returned per order by GET /order/:id - unbranded plain IPs, safe to pass straight to your own customers:
GET /api/v1/public/order/{orderId}
{
"proxyCredentials": {
"username": "...",
"password": "...",
"hostip": "<worldwide gateway>", // default gateway
"port": "1338",
"ports": { "http": "1338", "socks5": "1339" },
"endpoints": { // one gateway IP per country
"ww": "...", "us": "...", "de": "...", "gb": "...", "nl": "..."
},
"usage": { "bandwidth_left": 87.4, ... } // null on unlimited plans
}
}Sessions - append to the username
Default is rotating: a new IPv6 address on every request, nothing to configure. For a sticky session (keep the same exit IP), append -session-<id>-ttl-<seconds> to the username (password unchanged). The session id must be a number between 0 and 999999; ttl is the hold time in seconds, up to 86400 (24h) - e.g. ttl-1800 = 30 min, ttl-3600 = 1 hour. Use different session ids to hold several sticky IPs in parallel.
# Credentials + gateway IPs from GET /order/:id (same login on all gateways)
# username: ipv6user291 password: v6pass817
# endpoints.us -> US_GATEWAY, endpoints.de -> DE_GATEWAY, ...
# Rotating - fresh IPv6 address on every request (US gateway)
curl -x US_GATEWAY:1338 -U "ipv6user291:v6pass817" https://api6.ipify.org
# Sticky - hold the same IPv6 exit for 60 minutes (ttl is in SECONDS: 60 min = 3600)
curl -x DE_GATEWAY:1338 \
-U "ipv6user291-session-483920-ttl-3600:v6pass817" \
https://api6.ipify.org
# SOCKS5
curl --socks5 US_GATEWAY:1339 -U "ipv6user291:v6pass817" https://api6.ipify.orgThe target site must support IPv6
Exits are IPv6-only, so the destination needs an AAAA (IPv6) DNS record. Major platforms (Google, YouTube, Facebook, Instagram, TikTok) support it; many smaller sites do not and will be unreachable. Check your target domain first at ready.chair6.net, then confirm the proxy works end-to-end by requesting https://api6.ipify.org through it. An unreachable IPv6-less target typically surfaces as a 503 from the proxy.
| Field | Notes |
|---|---|
Bandwidth plans | bandwidth > 0 in /store. Track usage via bandwidth_left / usage on GET /order/:id (refreshed live). |
Unlimited plans | bandwidth "0" + speed cap in Mbps. usage is null in /order/:id - only expired_at limits the plan. |
Sticky session | -session-<id>-ttl-<seconds> appended to the username. id numeric 0-999999; ttl is the hold time in SECONDS, max 86400 (24h) - e.g. 1800 = 30 min, 3600 = 1h. Omit both for rotating. |
Authentication | username:password only. IP whitelisting is currently unavailable for IPv6 plans. |
Rotate password | POST /order/:id/reset-password issues a new 12-character password (old one stops immediately; new one activates in 1-2 minutes). Targeting flags live on the username, so only swap the new password into your proxy strings. |
Extending | Not supported - /order/:id/extendOptions returns an empty list. Buy a new package instead. |
Proxy response codes
| Code | Meaning |
|---|---|
407 | Wrong or missing proxy credentials. |
429 | Concurrent-connection / thread limit reached - lower parallelism or retry with backoff. |
503 | Could not reach the target - DNS failed or the site has no IPv6 (AAAA) support. |
504 | The target site did not respond in time. |
Rotating Mobile - Quick Guide
Rotating Mobile (proxyType: RotatingMobile) is a bandwidth product on real mobile carriers. Buy and extend it with just the packageId. Location and session targeting are appended to the username. Rotating IP per request by default.
Connecting
Use the host and port from GET /order/:id (proxyCredentials.hostip / port, HTTP port 5000). The same credentials work for every location; you choose the location by the username flags below.
| Target | Flag | Value format |
|---|---|---|
| Country | -country-US | ISO-2 code |
| Region / state | -region-california | region code from /regions |
| City | -city-los+angeles | city code from /cities |
| Carrier / ISP | -isp-at&t+wireless | isp code from /isps |
| Sticky session | -sid-ab12-ttl-30m | any id + ttl (see below) |
For a sticky IP add -sid-<id>-ttl-<duration>, where duration is one of 1m 5m 10m 30m 60m 120m 180m 240m (hold up to 4h). Omit the sticky flags for a fresh IP each request. All of region, city, isp and the sticky flags are optional.
Value format — read this before targeting
- Use the codes exactly as returned by the targeting endpoints. Spaces are written as
+, never as-— e.g.los+angeles,new+york,at&t+wireless. Regions are full names (california), not 2-letter codes. - An unknown or malformed value fails with 502 — it does not silently fall back to untargeted rotation. If you get a 502 on a targeted request, check the code first.
- Carrier availability varies by city, so a valid city + carrier pair can still return 502 if that carrier has no live IPs there right now. For reliable carrier targeting, pin the carrier at country level and omit the city flag. City targeting is metro-approximate, not pinpoint.
- Untargeted rotation is not evenly weighted across carriers. If you need a specific carrier mix, request each carrier explicitly rather than relying on the default rotation.
Discovering locations
The valid country / region / city / ISP codes come from the Mobile Targeting endpoints (/mobile-targeting-options/*). Those endpoints share a limit of 60 requests per 10 minutes - cache them (the lists rarely change), or download the full offline snapshot from the Targeting section for bulk setup. For a static starting point you can also reuse the city and US-state name lists in the Premium Residential targeting reference - the same place names apply, though the exact set valid for mobile comes from the endpoints above.
Example
# Credentials from GET /order/:id
# username: mobileuser71 password: mob9182pass
# host: HOST port: 5000
# Rotating mobile IP in the US (new IP per request)
curl -x HOST:5000 \
-U "mobileuser71-country-US:mob9182pass" \
https://ipinfo.io
# Rotating IP on AT&T anywhere in the US
curl -x HOST:5000 \
-U "mobileuser71-country-US-isp-at&t+wireless:mob9182pass" \
https://ipinfo.io
# Sticky IP on AT&T in California for 30 minutes
curl -x HOST:5000 \
-U "mobileuser71-country-US-region-california-isp-at&t+wireless-sid-ab12-ttl-30m:mob9182pass" \
https://ipinfo.ioErrors
| Status Code | Description |
|---|---|
200 | Success - Request completed successfully |
400 | Bad Request - Invalid parameters |
401 | Unauthorized - Invalid or missing API key |
403 | Forbidden - Not a reseller account or access denied |
404 | Not Found - Resource doesn't exist |
409 | Conflict - The charge stands and a human is finishing the order (custom create). Do NOT retry - a retry would buy a second plan. |
429 | Too Many Requests - Rate limit exceeded (also the per-endpoint limiters: custom create 1/10s, exchange 1/30s) |
500 | Internal Server Error - Something went wrong |
502 | Upstream error - the provider action failed and nothing was created/charged (safe to retry after a moment); on exchange, the message tells you if the value was already refunded (then do NOT retry). |
Error Response Format
{
"type": "error",
"message": "Insufficient balance. Required: $2.50, Available: $1.00",
"status": 400
}Ready to Get Started?
Create your first API key and start integrating CatProxies into your application today.
