Developers

Reseller API

Sell ProxyStream 4G and 5G mobile proxies under your own brand. List servers, buy proxies from your balance, and manage credentials, whitelist IPs and locations over a small REST API.

Base URLhttps://proxystream.net/api/reseller/v1

Quickstart

1. Find a server and its prices. Store your key in PROXYSTREAM_API_KEY.

Shell
curl https://proxystream.net/api/reseller/v1/servers \
  -H "Authorization: Bearer $PROXYSTREAM_API_KEY"

2. Buy a proxy on it. The response contains everything needed to connect.

Shell
curl -X POST https://proxystream.net/api/reseller/v1/proxies \
  -H "Authorization: Bearer $PROXYSTREAM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"server_id":12,"duration":"1w"}'

3. Use it.

Shell
curl -x http://a7k2m9x:q4w8e1r@168.231.79.20:8010 https://api.ipify.org

Authentication

Send your API key as a bearer token on every request:

Header
Authorization: Bearer psr_...

Keys are issued by our team. Ask on Telegram or at support@proxystream.net. A key belongs to one ProxyStream account: purchases are paid from that account's balance, which you top up on the deposit page, and the account owns every proxy you buy.

Keep the key on your server and never ship it to browsers or apps. If it leaks, ask us to revoke it and we will issue a new one.

Conventions

  • Requests and responses are JSON. Send Content-Type: application/json with a body.
  • Amounts are USD numbers with two decimals. Times are ISO 8601 in UTC.
  • Rate limit: 120 requests per minute per key. Beyond that you get rate_limited with a Retry-After header.
  • Lists are paginated with a cursor: pass next_cursor as cursor until it is null.
  • Versioning: /v1 only gains new optional fields and new endpoints, so ignore fields you don't know. Breaking changes ship as /v2, and /v1 keeps running for at least 6 months after that is announced.

Durations

CodeLength
4h4 hours
1d1 day
3d3 days
1w7 days
1mo1 calendar month

Your price for each duration is in the server list.

Endpoints

All paths are relative to https://proxystream.net/api/reseller/v1. Any endpoint can also return unauthorized, rate_limited or internal_error.

List servers

GET/servers

Servers that are online and have free capacity right now, best quality first, with your price for each duration. A server that fills up drops out of this list until a slot frees up.

Request
curl https://proxystream.net/api/reseller/v1/servers \
  -H "Authorization: Bearer $PROXYSTREAM_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": 12,
      "country": "US",
      "region": "Texas",
      "isp": "T-Mobile",
      "type": "Mobile 5G",
      "rotation_minutes": 15,
      "prices": [
        {
          "duration": "4h",
          "price": 0.4
        },
        {
          "duration": "1d",
          "price": 1
        },
        {
          "duration": "3d",
          "price": 2.5
        },
        {
          "duration": "1w",
          "price": 5
        },
        {
          "duration": "1mo",
          "price": 15
        }
      ]
    }
  ]
}

Get balance

GET/balance

The balance of your account. Every purchase is paid from it.

Request
curl https://proxystream.net/api/reseller/v1/balance \
  -H "Authorization: Bearer $PROXYSTREAM_API_KEY"
Response · 200 OK
{
  "balance": 42.5,
  "currency": "USD"
}

Buy a proxy

POST/proxies

Charges your balance the price listed in GET /servers and returns the new proxy, ready to use. Username and password are generated for you. You can change the password afterwards.

Buying is not idempotent. If a request times out, check GET /proxies?status=active before retrying, or you may buy twice.

Request body

FieldTypeDescription
server_id*integerA server id from GET /servers.
duration*stringOne of the duration codes.
Request
curl -X POST https://proxystream.net/api/reseller/v1/proxies \
  -H "Authorization: Bearer $PROXYSTREAM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"server_id":12,"duration":"1w"}'
Response · 201 Created
{
  "id": 90412,
  "status": "active",
  "host": "168.231.79.20",
  "http_port": 8010,
  "socks_port": 9010,
  "username": "a7k2m9x",
  "password": "q4w8e1r",
  "whitelist_ip": null,
  "server": {
    "id": 12,
    "country": "US",
    "region": "Texas",
    "isp": "T-Mobile",
    "type": "Mobile 5G",
    "rotation_minutes": 15
  },
  "created_at": "2026-09-27T10:00:00.000Z",
  "expires_at": "2026-10-04T10:00:00.000Z"
}

Errors: invalid_request, insufficient_balance, server_unavailable

List proxies

GET/proxies

All proxies on your account, newest first, one page at a time. Keep requesting with cursor set to next_cursor until next_cursor is null.

Query parameters

FieldTypeDescription
statusstringactive or expired. Omit for both.
limitintegerPage size, 1 to 100. Default 50.
cursorstringnext_cursor from the previous page, unchanged.
Request
curl https://proxystream.net/api/reseller/v1/proxies?status=active&limit=50 \
  -H "Authorization: Bearer $PROXYSTREAM_API_KEY"
Response · 200 OK
{
  "data": [
    {
      "id": 90412,
      "status": "active",
      "host": "168.231.79.20",
      "http_port": 8010,
      "socks_port": 9010,
      "username": "a7k2m9x",
      "password": "q4w8e1r",
      "whitelist_ip": null,
      "server": {
        "id": 12,
        "country": "US",
        "region": "Texas",
        "isp": "T-Mobile",
        "type": "Mobile 5G",
        "rotation_minutes": 15
      },
      "created_at": "2026-09-27T10:00:00.000Z",
      "expires_at": "2026-10-04T10:00:00.000Z"
    }
  ],
  "next_cursor": "OTA0MTI"
}

Errors: invalid_request

Get a proxy

GET/proxies/{id}

One proxy with its connection details.

Request
curl https://proxystream.net/api/reseller/v1/proxies/90412 \
  -H "Authorization: Bearer $PROXYSTREAM_API_KEY"
Response · 200 OK
{
  "id": 90412,
  "status": "active",
  "host": "168.231.79.20",
  "http_port": 8010,
  "socks_port": 9010,
  "username": "a7k2m9x",
  "password": "q4w8e1r",
  "whitelist_ip": null,
  "server": {
    "id": 12,
    "country": "US",
    "region": "Texas",
    "isp": "T-Mobile",
    "type": "Mobile 5G",
    "rotation_minutes": 15
  },
  "created_at": "2026-09-27T10:00:00.000Z",
  "expires_at": "2026-10-04T10:00:00.000Z"
}

Errors: not_found

Set whitelist IP

PUT/proxies/{id}/whitelist-ip

Lets one IPv4 address use the proxy without a username and password. Username and password keep working either way. Send null to clear it. Takes effect within about a minute.

Request body

FieldTypeDescription
whitelist_ip*string | nullAn IPv4 address, or null.
Request
curl -X PUT https://proxystream.net/api/reseller/v1/proxies/90412/whitelist-ip \
  -H "Authorization: Bearer $PROXYSTREAM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"whitelist_ip":"203.0.113.7"}'
Response · 200 OK
{
  "id": 90412,
  "status": "active",
  "host": "168.231.79.20",
  "http_port": 8010,
  "socks_port": 9010,
  "username": "a7k2m9x",
  "password": "q4w8e1r",
  "whitelist_ip": "203.0.113.7",
  "server": {
    "id": 12,
    "country": "US",
    "region": "Texas",
    "isp": "T-Mobile",
    "type": "Mobile 5G",
    "rotation_minutes": 15
  },
  "created_at": "2026-09-27T10:00:00.000Z",
  "expires_at": "2026-10-04T10:00:00.000Z"
}

Errors: invalid_request, not_found, proxy_expired

Change password

PUT/proxies/{id}/password

Sets a new proxy password. The username stays the same. Takes effect within about a minute.

Request body

FieldTypeDescription
password*string6 to 64 characters: letters, digits, dot, underscore or hyphen.
Request
curl -X PUT https://proxystream.net/api/reseller/v1/proxies/90412/password \
  -H "Authorization: Bearer $PROXYSTREAM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"password":"k3y-Rotated_2"}'
Response · 200 OK
{
  "id": 90412,
  "status": "active",
  "host": "168.231.79.20",
  "http_port": 8010,
  "socks_port": 9010,
  "username": "a7k2m9x",
  "password": "k3y-Rotated_2",
  "whitelist_ip": null,
  "server": {
    "id": 12,
    "country": "US",
    "region": "Texas",
    "isp": "T-Mobile",
    "type": "Mobile 5G",
    "rotation_minutes": 15
  },
  "created_at": "2026-09-27T10:00:00.000Z",
  "expires_at": "2026-10-04T10:00:00.000Z"
}

Errors: invalid_request, not_found, proxy_expired

Change server

PUT/proxies/{id}/server

Moves the proxy to another server, for example another carrier or region. Free of charge, and the expiry date does not change. The host and ports can change, so use the proxy in the response.

Request body

FieldTypeDescription
server_id*integerA server id from GET /servers.
Request
curl -X PUT https://proxystream.net/api/reseller/v1/proxies/90412/server \
  -H "Authorization: Bearer $PROXYSTREAM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"server_id":17}'
Response · 200 OK
{
  "id": 90412,
  "status": "active",
  "host": "168.231.79.20",
  "http_port": 8017,
  "socks_port": 9017,
  "username": "a7k2m9x",
  "password": "q4w8e1r",
  "whitelist_ip": null,
  "server": {
    "id": 17,
    "country": "US",
    "region": "New York",
    "isp": "Verizon",
    "type": "Mobile 5G",
    "rotation_minutes": 15
  },
  "created_at": "2026-09-27T10:00:00.000Z",
  "expires_at": "2026-10-04T10:00:00.000Z"
}

Errors: invalid_request, not_found, proxy_expired, server_unavailable

Objects

Proxy

Returned by every proxy endpoint, always in this shape.

FieldTypeDescription
idintegerProxy id.
statusstringactive, or expired once expires_at has passed.
hoststringProxy host to connect to.
http_portinteger | nullHTTP/HTTPS proxy port.
socks_portinteger | nullSOCKS proxy port.
usernamestringProxy username.
passwordstringProxy password.
whitelist_ipstring | nullIPv4 allowed without credentials.
serverServerThe server this proxy runs on.
created_atstringPurchase time, ISO 8601 UTC.
expires_atstringExpiry time, ISO 8601 UTC.

Server

FieldTypeDescription
idintegerServer id.
countrystringISO 3166-1 alpha-2 country code.
regionstringState or region.
ispstringMobile carrier.
typestringMobile 5G, Mobile 4G, Residential or Datacenter.
rotation_minutesinteger | nullHow often the exit IP rotates.
pricesarrayGET /servers only: { duration, price } for each duration code.

Errors

Errors use RFC 7807 with Content-Type: application/problem+json. Handle errors by type; detail is a readable explanation that can change wording.

Response · 402 Payment Required
{
  "type": "https://proxystream.net/docs/reseller-api#insufficient_balance",
  "title": "Insufficient balance",
  "status": 402,
  "detail": "This purchase costs 5.00 USD. Top up your balance and retry."
}
TypeStatusMeaningWhat to do
invalid_request400A parameter or the body is invalid.detail names the field. Fix it and retry.
unauthorized401The API key is missing, invalid or revoked.Check the Authorization header, or ask support for a new key.
insufficient_balance402Your balance does not cover the purchase. Nothing was charged.Top up your balance and retry.
not_found404No proxy with this id on your account.Check the id.
proxy_expired409Expired proxies cannot be changed.Buy a new proxy.
server_unavailable409The server is full or offline. Nothing was charged.Pick another server from GET /servers.
rate_limited429More than 120 requests in a minute.Wait Retry-After seconds.
internal_error500Unexpected failure on our side.Retry reads. Before retrying a purchase, check your proxy list.

The full type is this page's URL plus the code, e.g. https://proxystream.net/docs/reseller-api#server_unavailable.