Introduction
The VaultProxies Reseller API gives you programmatic control over the same proxy infrastructure exposed in the dashboard. Read your balance, list the catalog, place orders, pull live credentials for every service you have provisioned and generate ready-to-use proxy lines with geo targeting and sticky sessions. The surface is intentionally tiny: six endpoints, one header, JSON over HTTPS.
No SDKs, no proprietary client to install. Drop a curl command into your stack and you are running. If you prefer Python or Node, examples are inline on every endpoint below.
Authentication
Every request must include your API key in the X-API-Key header. For POST /api/reseller/order also send Content-Type: application/json. Keys are issued from the reseller dashboard after your account is approved.
curl -H "X-API-Key: YOUR_API_KEY" \
https://vaultproxies.net/api/reseller/balanceBase URL
All endpoints below are relative to:
https://vaultproxies.netReseller pricing
Every order placed with a reseller API key is billed at the reseller rate, not the public retail rate, so there is nothing to enable. Your reseller loyalty discount, if any, applies on top at checkout. The table below is live, read from GET /api/reseller/pricing, so it always matches what you are charged. From code, call GET /api/reseller/categories with your key: its price_per_unit_cents is your rate.
| Proxy type | Key | Your cost | Public retail | Margin |
|---|---|---|---|---|
Live reseller rates. Time-priced plans (e.g. dc_unlim) show the per-day rate; pass week or month as time_unit when ordering for those tiers.
Want the full retail price book in one page? See /pricing.
Get balance
Returns your current account balance in cents. Divide by 100 for the dollar amount. The same value is shown on the reseller dashboard wallet card.
/api/reseller/balancecurl -X GET \
-H "X-API-Key: YOUR_API_KEY" \
"https://vaultproxies.net/api/reseller/balance"Response
{
"balance_cents": 15000
}List categories
Returns every plan you can order, priced for your key. price_per_unit_cents is the reseller rate you are billed at, not retail; retail_price_per_unit_cents is our public price for the same unit, so the difference is your margin. volume_tiers is null whenever your rate is flat. Pass a key as category_key when ordering. Cache the response on your side, the catalog moves slowly.
/api/reseller/categoriescurl -X GET \
-H "X-API-Key: YOUR_API_KEY" \
"https://vaultproxies.net/api/reseller/categories"Response
{
"categories": [
{
"id": 1,
"key": "resi_pergb",
"display_name": "Residential /GB",
"pricing_type": "pergb",
"unit": "GB",
"price_per_unit_cents": 50,
"retail_price_per_unit_cents": 100,
"min_units": 1,
"max_units": 5000,
"unit_block_hours": 0,
"hidden": false,
"volume_tiers": null
},
{
"id": 3,
"key": "dc_unlim",
"display_name": "Datacenter Unlimited",
"pricing_type": "unlim",
"unit": "DAY",
"price_per_unit_cents": 250,
"retail_price_per_unit_cents": 500,
"min_units": 1,
"max_units": 61,
"unit_block_hours": 24,
"hidden": false,
"volume_tiers": null
}
]
}Create order
Provisions a new proxy service against your balance. Specify the plan with category_key, the quantity with units, and for unlimited plans the billing window with time_unit. The response includes the freshly minted credentials and the matching invoice.
/api/reseller/ordercurl -X POST \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"category_key": "resi_pergb", "units": 5}' \
"https://vaultproxies.net/api/reseller/order"Request body
{
"category_key": "resi_pergb",
"units": 5,
"time_unit": "day"
}category_key accepts resi_pergb, resi_unlim, dc_unlim, dc_pergb, mobile_pergb and dedicated_isp.
Dedicated ISP orders
dedicated_isp takes two extra fields. pool is required, stock is finite per pool and is validated before you are charged, so an order without it is rejected with a 400. Fetch the pools and their live stock from GET /api/reseller/proxy/isp-pools first, with your X-API-Key.
{
"category_key": "dedicated_isp",
"units": 1,
"pool": "ISP_US_SNEAKERS", // required, see GET /api/reseller/proxy/isp-pools
"term_days": 30 // optional: 30, 60 or 90 (default 30)
}The term is fixed at purchase. Dedicated ISP has no renewal path, so extending an existing plan is rejected, order a fresh one instead. units is the number of exclusive IPs, and each is delivered with its own credential rather than one pair for the plan.
/api/reseller/proxy/isp-poolsPools available for dedicated_isp, with live stock. Only pools that can be fulfilled right now are returned, so any pool value from here is safe to order against - subject to stock covering your units.
{
"pools": [
{
"pool": "ISP_US_SNEAKERS",
"title": "US Sneaker Proxies (ISP)",
"stock": 6279,
"in_stock": true,
"is_subnet": false
}
]
}Response
{
"service": {
"id": 123,
"user_id": 1,
"category_id": 1,
"status": "active",
"pricing_type": "pergb",
"unit": "GB",
"remaining_gb": 5,
"username": "abc123xyz",
"password": "secretpass123",
"created_at": "2026-05-05T12:00:00Z"
},
"invoice": {
"id": 456,
"amount_cents": 425,
"status": "paid"
}
}List services
Returns every active service on your account along with its live credentials, status and remaining bandwidth. Use this to hand fresh credentials to your downstream customers, or to poll for top-up triggers.
/api/reseller/servicescurl -X GET \
-H "X-API-Key: YOUR_API_KEY" \
"https://vaultproxies.net/api/reseller/services"Response
{
"services": [
{
"id": 123,
"username": "abc123xyz",
"password": "secretpass123",
"remaining_gb": 4.5,
"status": "active",
"expires_at": "2026-07-06T12:00:00Z"
}
]
}Generator locations
Lists what you can geo-target for a plan. Pass the plan with plan_key (defaults to resi_unlim); add country to narrow to one country. What comes back depends on the plan:
resi_pergb: every country, and withcountry=USthe US states. Cities are not listed: this pool rejects a city name, so target a city withextra.geoname_id(e.g.5368361for Los Angeles). Other countries' states still work as ISO 3166-2 codes instate.pool4_pergb: countries, US states and their cities.mobile_pergb,shared_isp,eu_isp,dc_pergbandresi_unlim_budget: countries only.ipv6_pergb: an empty list, it has no geo targeting.
/api/reseller/proxy/generator/locationscurl -X GET \
-H "X-API-Key: YOUR_API_KEY" \
"https://vaultproxies.net/api/reseller/proxy/generator/locations?plan_key=resi_pergb&country=US"Response
{
"countries": [
{
"code": "US",
"name": "United States",
"states": [
{ "code": "CA", "name": "California" },
{ "code": "NY", "name": "New York" }
]
}
]
}Generate proxies
Turns one of your active services into ready-to-use proxy lines. Supports rotating and sticky sessions, geo targeting (where the plan allows it), HTTP and SOCKS5, and several output formats. The response always carries the exact hostname and port to connect to, so you never have to hardcode gateways.
/api/reseller/proxy/generations/createcurl -X POST \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"service_id": 123,
"plan_key": "resi_pergb",
"country": "US",
"protocol": "HTTP",
"format": "user:pass@ip:port",
"extra": { "mode": "sticky", "count": 5, "session_seconds": 600 }
}' \
"https://vaultproxies.net/api/reseller/proxy/generations/create"Response
{
"generations": [
{
"id": 1751712000000000000,
"user_id": 1,
"service_id": 123,
"plan_key": "resi_pergb",
"country": "us",
"protocol": "HTTP",
"format": "user:pass@ip:port",
"hostname": "gate-eu.vaultproxies.com",
"port": 80,
"username": "abc123xyz-geo-us-sess-k2j9x1pq-life-600",
"password": "secretpass123",
"output_line": "abc123xyz-geo-us-sess-k2j9x1pq-life-600:[email protected]:80",
"created_at": "2026-07-05T12:00:00Z"
}
],
"generation": { "...": "first entry of generations, same shape" }
}Request parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
service_id | integer | Yes | Active service to generate from. Must belong to your account and be status active. |
plan_key | string | Yes | Must match the service's plan: resi_pergb, resi_unlim, resi_unlim_budget, dc_unlim, dc_pergb, mobile_pergb, backup_pergb, ipv6_pergb, shared_isp (US ISP), eu_isp (EU ISP). |
protocol | string | No | HTTP (default) or SOCKS5. Picks the port in the generated line, see the per-plan table below. |
format | string | No | Output line format: ip:port:user:pass (default), user:pass@ip:port, ip:port@user:pass, user:pass:ip:port, ip:port:pass:user, protocol://user:pass@ip:port, protocol://ip:port, ip:port, user:pass. host: is accepted in place of ip:. |
country | string | No | ISO-2 code (e.g. US) or full name, see the locations endpoint for what each plan allows. On dc_unlim it only picks the EU vs US gateway; ignored on ipv6_pergb. On resi_unlim_budget country is the only geo dimension, state and city are ignored. |
region | string | No | resi_pergb only: a multi-country grouping. Continent codes (EU, NA, SA, AS, AF, OC) or a finer region (nordics, dach, benelux, euwest, eueast, apac, mena, latam). Mutually exclusive with country/state/city. The old name `continent` is still accepted. |
state | string | No | State code or name. Respected on resi_pergb (the locations endpoint lists the US states; elsewhere use the ISO 3166-2 code), pool4_pergb (US, two-letter code), resi_unlim and backup_pergb. Country-only plans (mobile_pergb, shared_isp, eu_isp, dc_pergb) have no state dimension. |
city | string | No | City name. Respected on pool4_pergb, resi_unlim and backup_pergb. NOT on resi_pergb: that pool rejects a city name, so use extra.geoname_id there (e.g. 5368361 for Los Angeles). |
ips | string[] | No | shared_isp only: static IPs (e.g. ["83.245.53.70"]) to pin each line to. One line is emitted per IP and extra.count is ignored. Mutually exclusive with sticky mode. |
extra.postal_code | string | No | resi_pergb only: exact postal code, letters and digits, up to 12 characters (e.g. 90011, SW1A1AA). Works best combined with country. With no node online in that code the connection is refused rather than moved to a nearby one. |
extra.dma | integer | No | resi_pergb only: US Nielsen metro (DMA) code, 501 New York, 803 Los Angeles. |
extra.geoname_id | integer | No | resi_pergb only: exact city by GeoNames ID (e.g. 5128581 for New York City). Unambiguous where city names collide, prefer it over city when you know the ID. |
extra.asn | integer | No | resi_pergb only: autonomous system number, digits only, no AS prefix (e.g. 13335). |
extra.isp | string | No | resi_pergb only: ISP or carrier name. Spaces, accents and punctuation are removed automatically, so T-Mobile is sent as TMobile. |
extra.timezone | string | No | resi_pergb only: IANA timezone (e.g. America/New_York). Case-sensitive. |
extra.latitude | number | No | resi_pergb only: radius-search centre latitude, -90 to 90. Requires longitude; ignored on its own. |
extra.longitude | number | No | resi_pergb only: radius-search centre longitude, -180 to 180. Requires latitude; ignored on its own. |
extra.radius_km | integer | No | resi_pergb only: radius in km around latitude/longitude. 1-100; larger values are clamped to 100. Any node inside the circle may be used, the compass letters are added for you, so pass plain signed decimals. |
extra.mode | string | No | rotating (default) or sticky. Sticky keeps the same IP for the session window. Not available on ipv6_pergb (always rotating). |
extra.count | integer | No | How many proxy lines to generate. 1-10000, default 1. |
extra.session_seconds | integer | No | Sticky session lifetime in seconds (default 600). Caps: resi_pergb 21,600 (6 h); shared_isp and resi_unlim_budget 86,400 (24 h). resi_unlim and mobile_pergb are converted to whole minutes, pass at least 60; mobile_pergb caps at 7,200 (2 h). Ignored on eu_isp. |
extra.session_minutes | integer | No | Alternative to session_seconds, sticky lifetime in minutes. Ignored when session_seconds is also set. |
extra.session_length | string | No | eu_isp only: qualitative sticky length, long (default) or short. EU ISP sessions take no numeric TTL. |
Per-plan hosts, ports & capabilities
Every plan runs its own gateway. HTTP and SOCKS5 may sit on different ports; geo targeting and sticky-session limits also vary. The generate response always returns the correct hostname and port, so treat this table as a reference rather than something to hardcode.
Hostnames are always ours. To give your customers your own domain, point a CNAME at the plan host (or an A record at its IP) and substitute it in the lines you hand out, or run your own gateway in front and forward with the credential. Authentication is by username and password alone, so any of these works with no setup on our side.
| Plan | Host | HTTP / SOCKS5 | Geo targeting | Sticky sessions |
|---|---|---|---|---|
resi_pergb | gate-eu.vaultproxies.com | 80 / 80 (shared) | Country, continent, state, postal code, metro (DMA), GeoNames id, ASN, ISP, timezone, radius, continent is mutually exclusive with country/state | Up to 6 h (session_seconds ≤ 21600) |
resi_unlim | resi.vaultproxies.com | 8080 / 1080 | Country, state, city | Up to 24 h (session_seconds ≤ 86400), converted to whole minutes, pass at least 60 |
resi_unlim_budget | assigned per service | returned by generate | None | Up to 24 h (session_seconds ≤ 86400) |
dc_unlim | eu-dc.vaultproxies.com | 10808 / 10808 (shared) | Country, picks the EU or US gateway only | Up to 24 h (session_seconds ≤ 86400) |
pool4_pergb | gate-us.vaultproxies.com | 10000 / 11000 | Country, state, city, ASN | Up to 10 min (session_seconds ≤ 600) |
dc_pergb | gate-us.vaultproxies.com | 777 / 666 | Country | Up to 24 h (session_seconds ≤ 86400) |
mobile_pergb | gate-eu.vaultproxies.com | 8080 / 1080 | Country, ASN | Up to 2 h (session_seconds ≤ 7200), converted to whole minutes |
backup_pergb | na.vaultproxies.com | 80 / 80 (shared) | Country, state, city | Up to 24 h (session_seconds ≤ 86400) |
shared_isp | gate-us.vaultproxies.com | 30 / 31 | Country, IP pinning, via ips, mutually exclusive with sticky | Up to 24 h (session_seconds ≤ 86400), mutually exclusive with ips |
eu_isp | gate-eu.vaultproxies.com | 30 / 31 | Country | None (always rotating) |
ipv6_pergb | gate-us.vaultproxies.com | 30 / 31 | None | None (always rotating) |
ipv6_dc_pergb | gate-us.vaultproxies.com | 30 / 31 | None | Up to 24 h (session_seconds ≤ 86400) |
ipv6_dc_unlim | gate-us.vaultproxies.com | 30 / 31 | None | Up to 24 h (session_seconds ≤ 86400) |
Targeting tokens
Targeting rides inside the proxy username as -key-value pairs appended to the base username. The generator builds these for you when you pass country, state and city - this reference is for hand-built credentials and for anything you expose to your own customers.
ca3ddbbd85591e7f-geo-us-st-california-sess-drfse9co-life-21600| Token | Selects | Example |
|---|---|---|
geo- | Country, ISO-3166 alpha-2 | geo-us |
st- | State or province | st-california |
loc- | City | loc-dallas |
reg- | A group of COUNTRIES, not a state | reg-nordics |
pc- | Postal / ZIP code | pc-90001 |
dma- | Metro area (Nielsen DMA) | dma-501 |
gid- | GeoNames city id | gid-5368361 |
asn- | Autonomous system number | asn-7922 |
isp- | ISP or mobile carrier | isp-comcast |
tz- | Timezone | tz-america_new_york |
near- | Radius search, lat, long, km | near-34.05N118.24W50 |
ip- | Pin one static IP (dots as underscores) | ip-203_0_113_7 |
sess- | Sticky session id, same exit IP while it lives | sess-a1b2c3d4 |
life- | Session lifetime, in seconds | life-600 |
A plan only honours the tokens its pool can actually act on. Sending one it does not support is an error, not a silent downgrade, so you never end up somewhere you did not ask for.
| Plan | Tokens it honours |
|---|---|
resi_pergb | geo, reg, st, pc, dma, gid, asn, isp, tz, near, sess, life (no loc: a city name is refused, use gid) |
mobile_pergb | geo, reg, asn, sess, life |
dc_pergb | geo, reg, sess, life, US-only pool |
shared_isp | geo, ip, sess, life, US-only pool |
ipv6_pergb | None, US-only pool, nothing left to choose |
eu_isp | geo, NL-only pool; no sticky, it rotates regardless of session |
dedicated_isp | None, the IP you were assigned is the targeting |
resi_unlim, resi_unlim_budget, dc_unlim, backup_pergb | Different grammar, these run on vendor gateways, not ours; generate them from the dashboard or /api/proxy/generate |
GET /api/plans/catalog is public and returns the same per-plan targeting list, alongside each plan’s gateway host and ports, read it from your code rather than hard-coding this table.
Order parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
category_key | string | Yes | Any key from GET /api/reseller/categories, e.g. resi_pergb, mobile_pergb, dedicated_isp. |
units | integer | Yes | Quantity to purchase. GB for pergb plans, hours/days for unlim plans. |
time_unit | string | No | For unlim plans only: hour, day, week, month. |
pool | string | For dedicated_isp | Required for dedicated_isp: a pool ID from GET /api/reseller/proxy/isp-pools, e.g. ISP_US_SNEAKERS. Orders without it are rejected. |
addons | object[] | No | ipv6_dc_unlim new orders only: hand-provisioned extras, each { key, location? }. Keys: dedicated_server_1g ($15 / 30 days, needs a location), ipv6_pool_40 ($15 / 30 days) or ipv6_pool_36 ($50 / 30 days), one pool per order. Charged per 30 days of the plan, rounded up, at cost. Provisioned by hand within 1 business day. Prices and locations: GET /api/catalog/addons?plan_key=ipv6_dc_unlim. |
term_days | integer | No | dedicated_isp only: 30, 60 or 90 (default 30). Fixed at purchase. |
Error responses
Errors are returned as JSON with an error field and the matching HTTP status code. The most common cases are missing parameters (400), invalid keys (401), insufficient balance (402), suspended accounts (403) and rate-limit hits (429).
{
"error": "insufficient balance"
}| Status | Meaning |
|---|---|
200 | Success |
201 | Created |
400 | Bad request, check parameter names and types |
401 | Unauthorized, X-API-Key header missing or invalid |
402 | Insufficient balance for the requested order |
403 | Account suspended |
429 | Rate limit exceeded |
Rate limits
The default rate limit is 120 requests per second per API key (7,200 / min) , generous enough for production scrapers, schedulers, and CI jobs without us getting in your way. Each response carries the standard rate-limit headers:
X-RateLimit-Limit: max requests per windowX-RateLimit-Remaining: remaining requests in this windowX-RateLimit-Reset: seconds until the window resets
If you genuinely need uncapped throughput for production scale, message us on /support and we will raise it on your account. Live network status is at /status.
Quick start
Complete workflow: check balance, browse the catalog, place an order, read back the credentials, then generate proxy lines.
# 1. Check your balance
curl -H "X-API-Key: YOUR_API_KEY" "https://vaultproxies.net/api/reseller/balance"
# 2. View available plans
curl -H "X-API-Key: YOUR_API_KEY" "https://vaultproxies.net/api/reseller/categories"
# 3. Order 5 GB residential
curl -X POST \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"category_key": "resi_pergb", "units": 5}' \
"https://vaultproxies.net/api/reseller/order"
# 4. List all your services with live credentials
curl -H "X-API-Key: YOUR_API_KEY" "https://vaultproxies.net/api/reseller/services"
# 5. Generate 5 US rotating proxy lines from the new service
curl -X POST \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"service_id": 123, "plan_key": "resi_pergb", "country": "US", "extra": {"count": 5}}' \
"https://vaultproxies.net/api/reseller/proxy/generations/create"