Reseller panel

Reseller API

https://proxiesfood.com/api/reseller

Auth

Header api-key: rk_… or Authorization: Bearer rk_…. One key per account.

curl https://proxiesfood.com/api/reseller/account -H "api-key: rk_..."

Rate limits

EndpointsLimitCounted per
Everything120 / minuteAPI key
/generate, /customers/:key/stats, /customers/stats30 / minuteAccount
/login20 / 15 minutesIP
Wrong API key or session30 / 15 minutesIP

Over the limit returns 429 with code RATE_LIMITED. The 120/minute limit sends RateLimit headers (draft-7); the 30/minute one does not.

Format

Errors

{"error": "text", "code": "CODE"}

CodeStatusExtra fieldsMeaning
VALIDATION400Bad or missing field
UNAUTHORIZED401Missing or wrong key
INSUFFICIENT_BALANCE402need_cents, balance_centsTop up first
SUSPENDED403Account suspended
SESSION_ONLY403Panel login required
NOT_FOUND404No such customer, plan or top-up
POOL_EXCEEDED409free_mbps, pool_mbps, assigned_mbpsNot enough throughput
TRIAL_LIMIT409limit, used_24hTrial limit reached
RATE_LIMITED429Slow down
RIPTIDE_ERROR502detailProxy backend refused. Retry
PAYMENT_ERROR502detailInvoice could not be created
SERVER_ERROR500Retry

Endpoints

MethodPathBody / queryReturns
POST/login{username, password}token (7 days), reseller
GET/accountreseller, pool_mbps, assigned_mbps, free_mbps, active_plans, trials, customers, warnings[]
POST/account/host{host}, empty resetshost, custom_host
GET/account/api-keypanel login onlyapi_key
POST/account/api-key/rotatepanel login onlyapi_key
GET/prices?days=30prices[], tiers[], tier
POST/plans/quote{mbps, days}list_cents, discount_pct, total_cents
GET/plans?all=1 includes endedplans[], pool_mbps
POST/plans{mbps, days}plan, quote, balance_cents, pool_mbps
POST/plans/:id/extend{days}plan, quote, balance_cents
GET/customerscustomers[]
POST/customers{mbps, days?, hours?, label?} at least 1 hourcustomer
POST/customers/trial{mbps?, minutes?, label?}customer, trials
GET/customers/:keycustomer
PATCH/customers/:key{mbps?, label?}customer
POST/customers/:key/extend{days?, hours?} negative removes timecustomer
POST/customers/:key/reset-passwordcustomer with a new password
POST/customers/:key/pausecustomer
POST/customers/:key/resumecustomer
DELETE/customers/:key{success: true}
GET/customers/:key/statskey, live, day
POST/customers/stats{keys[]} max 50stats by key
POST/generate{customer, pool?, countries?[], session?, session_time?, format?, count?}host, port, username, password, pool, format, count, lines[], text
GET/countriescountries[] of {code, name}
GET/ledger?limit=100&before=identries[]
GET/topupstopups[], min_usd
POST/topups{amount_usd}order_id, payment_url, track_id, expires_at
GET/topups/:orderIdtopup

Throughput

You buy plans. A plan is N Mbps for D days, paid from your balance.

pool_mbpsMbps of all plans running now
assigned_mbpsMbps of your active customers
free_mbpsWhat you can still hand out
curl -X POST https://proxiesfood.com/api/reseller/plans \
  -H "api-key: rk_..." -H "Content-Type: application/json" \
  -d '{"mbps":500,"days":30}'

Customers

Every customer is one proxy user with their own username, password and speed. The key cust_… is how you address them here; your customer never sees it.

FieldValues
mbps1 to 100000. Must fit in free_mbps
days, hoursEither or both, at least 1 hour in total
labelYour own note, up to 64 characters
statusactive, paused (by you), pool_paused (no throughput), expired
curl -X POST https://proxiesfood.com/api/reseller/customers \
  -H "api-key: rk_..." -H "Content-Type: application/json" \
  -d '{"mbps":100,"days":30,"label":"john"}'

Trials

POST /customers/trial creates a short free customer.

FieldValues
mbpsUp to your trial speed. Default 100
minutes1 to 30. Default 30
labelDefault Trial

Stats

live.threadsOpen connections, last 30 seconds
live.throughput_mbpsSpeed right now
day.bytesBandwidth, last 24 hours
day.requestsRequests, last 24 hours

Batch up to 50 keys with POST /customers/stats. Keys that do not exist are left out of stats instead of failing the call.

curl -X POST https://proxiesfood.com/api/reseller/customers/stats \
  -H "api-key: rk_..." -H "Content-Type: application/json" \
  -d '{"keys":["cust_a7bdeed788e791fb","cust_1c02f4be7719aa30"]}'

Generate

Builds ready proxy lines for one customer. Same output as the panel generator.

FieldValues
customerCustomer key. Required
poolfast or resi. Leave it out for the default pool
countriesISO codes from /countries, max 50. One line per country. Unknown codes are dropped
sessionYour own id, letters and digits. Leave it out for rotating IPs
session_timeHow long a session keeps its IP: 1s to 24h (units s, m, h), default 30m. A bare number is minutes
session_minutesMinutes, 1 to 1440. Same as session_time
formathostport (default), userhost, http, curl, json
count1 to 100000. Above 1 every line gets its own session id
curl -X POST https://proxiesfood.com/api/reseller/generate \
  -H "api-key: rk_..." -H "Content-Type: application/json" \
  -d '{"customer":"cust_a7bdeed788e791fb","pool":"fast","countries":["US","DE"],"session_time":"1h","format":"hostport","count":1000}'

Formats

hostporthost:port:user:pass
userhostuser:pass@host:port
httphttp://user:pass@host:port
curlA full curl command
json{host, port, username, password}

Username

user_xxxx[-pool-fast][-country-US][-session-abc123-time-1h]

-time- takes 5s, 60s, 30m, 1h, 24h, up to 24 hours. A bare number is minutes.

You can build it yourself instead of calling /generate. HTTP(S) and SOCKS5 on port 81.

Balance

Objects

Customer

{
  "key": "cust_a7bdeed788e791fb",
  "label": "john",
  "username": "user_01b9548369",
  "password": "5b408c8930",
  "mbps": 100,
  "expires_at": "2026-10-15T09:54:27.333Z",
  "days_left": 30,
  "seconds_left": 2591998,
  "status": "active",
  "is_trial": false,
  "created_at": "2026-09-15T09:54:27.333Z",
  "proxy": { "host": "103.47.145.246", "port": 81, "username": "user_01b9548369", "password": "5b408c8930" }
}

Plan

{
  "id": 12,
  "mbps": 500,
  "starts_at": "2026-09-15T09:54:27.333Z",
  "ends_at": "2026-10-15T09:54:27.333Z",
  "days_left": 30,
  "paid_cents": 57000,
  "paid_usd": "570.00",
  "status": "active",
  "created_at": "2026-09-15T09:54:27.333Z"
}

Account

{
  "reseller": {
    "username": "demo",
    "status": "active",
    "host": "103.47.145.246",
    "port": 81,
    "custom_host": null,
    "discount_pct": 5,
    "tier": { "tier": 2, "tiers": 5, "discount_pct": 5, "lifetime_usd": "600.00",
              "next": { "tier": 3, "discount_pct": 10, "need_usd": "400.00" } },
    "trials": { "limit": 5, "used_24h": 1, "left": 4, "max_mbps": 1000, "max_minutes": 30 },
    "balance_cents": 12500, "balance_usd": "125.00",
    "lifetime_deposit_cents": 60000, "lifetime_deposit_usd": "600.00"
  },
  "pool_mbps": 750, "assigned_mbps": 700, "free_mbps": 50,
  "active_plans": 2,
  "customers": { "total": 6, "active": 4, "paused": 1, "pool_paused": 0, "expired": 1 },
  "warnings": [ { "type": "plan_ending", "plan_id": 12, "mbps": 250, "short_mbps": 200,
                  "ends_at": "2026-09-18T09:54:27.333Z", "text": "250 Mbps plan ends in 3 days." } ]
}

Ledger entry

{
  "id": 41, "kind": "plan",
  "amount_cents": -57000, "amount_usd": "-570.00",
  "balance_after_cents": 12500, "balance_after_usd": "125.00",
  "ref_type": "plan", "ref_id": "12",
  "note": "500 Mbps, 30 days",
  "created_at": "2026-09-15T09:54:27.333Z"
}

Top-up

{
  "order_id": "RT_1757930067333_9f2ab1c4d5e6",
  "status": "paid",
  "requested_cents": 10000, "requested_usd": "100.00",
  "credited_cents": 10000, "credited_usd": "100.00",
  "track_id": "84721993",
  "payment_url": "https://pay.oxapay.com/...",
  "created_at": "2026-09-15T09:54:27.333Z",
  "paid_at": "2026-09-15T10:02:11.004Z"
}

Hostname

Point an A record at 103.47.145.246 and set it with POST /account/host. Every line from /generate and every proxy.host then uses your hostname.