https://proxiesfood.com/api/reseller
Header api-key: rk_… or Authorization: Bearer rk_…. One key per account.
curl https://proxiesfood.com/api/reseller/account -H "api-key: rk_..."
/account/api-key and /account/api-key/rotate need a panel login. With an API key they return SESSION_ONLY.SUSPENDED.| Endpoints | Limit | Counted per |
|---|---|---|
| Everything | 120 / minute | API key |
/generate, /customers/:key/stats, /customers/stats | 30 / minute | Account |
/login | 20 / 15 minutes | IP |
| Wrong API key or session | 30 / 15 minutes | IP |
Over the limit returns 429 with code RATE_LIMITED. The 120/minute limit sends RateLimit headers (draft-7); the 30/minute one does not.
Content-Type: application/json on POST and PATCH.{"success": true, …}.*_cents field has a *_usd string next to it.2026-10-15T09:54:27.333Z.{"error": "text", "code": "CODE"}
| Code | Status | Extra fields | Meaning |
|---|---|---|---|
VALIDATION | 400 | Bad or missing field | |
UNAUTHORIZED | 401 | Missing or wrong key | |
INSUFFICIENT_BALANCE | 402 | need_cents, balance_cents | Top up first |
SUSPENDED | 403 | Account suspended | |
SESSION_ONLY | 403 | Panel login required | |
NOT_FOUND | 404 | No such customer, plan or top-up | |
POOL_EXCEEDED | 409 | free_mbps, pool_mbps, assigned_mbps | Not enough throughput |
TRIAL_LIMIT | 409 | limit, used_24h | Trial limit reached |
RATE_LIMITED | 429 | Slow down | |
RIPTIDE_ERROR | 502 | detail | Proxy backend refused. Retry |
PAYMENT_ERROR | 502 | detail | Invoice could not be created |
SERVER_ERROR | 500 | Retry |
| Method | Path | Body / query | Returns |
|---|---|---|---|
| POST | /login | {username, password} | token (7 days), reseller |
| GET | /account | reseller, pool_mbps, assigned_mbps, free_mbps, active_plans, trials, customers, warnings[] | |
| POST | /account/host | {host}, empty resets | host, custom_host |
| GET | /account/api-key | panel login only | api_key |
| POST | /account/api-key/rotate | panel login only | api_key |
| GET | /prices | ?days=30 | prices[], tiers[], tier |
| POST | /plans/quote | {mbps, days} | list_cents, discount_pct, total_cents |
| GET | /plans | ?all=1 includes ended | plans[], pool_mbps |
| POST | /plans | {mbps, days} | plan, quote, balance_cents, pool_mbps |
| POST | /plans/:id/extend | {days} | plan, quote, balance_cents |
| GET | /customers | customers[] | |
| POST | /customers | {mbps, days?, hours?, label?} at least 1 hour | customer |
| POST | /customers/trial | {mbps?, minutes?, label?} | customer, trials |
| GET | /customers/:key | customer | |
| PATCH | /customers/:key | {mbps?, label?} | customer |
| POST | /customers/:key/extend | {days?, hours?} negative removes time | customer |
| POST | /customers/:key/reset-password | customer with a new password | |
| POST | /customers/:key/pause | customer | |
| POST | /customers/:key/resume | customer | |
| DELETE | /customers/:key | {success: true} | |
| GET | /customers/:key/stats | key, live, day | |
| POST | /customers/stats | {keys[]} max 50 | stats by key |
| POST | /generate | {customer, pool?, countries?[], session?, session_time?, format?, count?} | host, port, username, password, pool, format, count, lines[], text |
| GET | /countries | countries[] of {code, name} | |
| GET | /ledger | ?limit=100&before=id | entries[] |
| GET | /topups | topups[], min_usd | |
| POST | /topups | {amount_usd} | order_id, payment_url, track_id, expires_at |
| GET | /topups/:orderId | topup |
You buy plans. A plan is N Mbps for D days, paid from your balance.
pool_mbps | Mbps of all plans running now |
assigned_mbps | Mbps of your active customers |
free_mbps | What you can still hand out |
POOL_EXCEEDED with free_mbps.pool_paused. Buy throughput and the oldest resume first./prices, your tier discount is already in your_cents. /plans/quote gives the exact price before you buy.curl -X POST https://proxiesfood.com/api/reseller/plans \
-H "api-key: rk_..." -H "Content-Type: application/json" \
-d '{"mbps":500,"days":30}'
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.
| Field | Values |
|---|---|
mbps | 1 to 100000. Must fit in free_mbps |
days, hours | Either or both, at least 1 hour in total |
label | Your own note, up to 64 characters |
status | active, paused (by you), pool_paused (no throughput), expired |
extend takes negative days or hours to cut time. Expiry never drops below now, and never goes past 3650 days ahead.reset-password issues a new random password. The username never changes.PATCH {mbps} changes speed live. Raising it needs free throughput.DELETE removes the proxy user for good.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"}'
POST /customers/trial creates a short free customer.
| Field | Values |
|---|---|
mbps | Up to your trial speed. Default 100 |
minutes | 1 to 30. Default 30 |
label | Default Trial |
/account under trials. Over it returns TRIAL_LIMIT.live.threads | Open connections, last 30 seconds |
live.throughput_mbps | Speed right now |
day.bytes | Bandwidth, last 24 hours |
day.requests | Requests, 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"]}'
Builds ready proxy lines for one customer. Same output as the panel generator.
| Field | Values |
|---|---|
customer | Customer key. Required |
pool | fast or resi. Leave it out for the default pool |
countries | ISO codes from /countries, max 50. One line per country. Unknown codes are dropped |
session | Your own id, letters and digits. Leave it out for rotating IPs |
session_time | How long a session keeps its IP: 1s to 24h (units s, m, h), default 30m. A bare number is minutes |
session_minutes | Minutes, 1 to 1440. Same as session_time |
format | hostport (default), userhost, http, curl, json |
count | 1 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}'
hostport | host:port:user:pass |
userhost | user:pass@host:port |
http | http://user:pass@host:port |
curl | A full curl command |
json | {host, port, username, password} |
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.
POST /topups, minimum $25, and open payment_url to pay in crypto.GET /topups/:orderId for pending, confirming, then paid. Balance moves when it says paid.GET /ledger lists every move: topup, plan, extend, adjust.{
"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" }
}
{
"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"
}
{
"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." } ]
}
{
"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"
}
{
"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"
}
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.