Reseller API
Buy datacenter and residential capacity in bulk, then provision, meter and suspend packages for your own customers.
Reseller API
The reseller API lets you run your own proxy storefront on top of RedScrape. You buy capacity from your wallet balance and provision packages for your customers, each with its own credentials, traffic limit and lifecycle.
Reseller access is off by default. An admin has to enable it for your account before any endpoint on this page works. Request activation through a support ticket, then generate a key in Dashboard → Reseller.
Authentication
Reseller endpoints use a separate credential from the regular API key:
curl -H "X-Reseller-Key: your_reseller_key" \
https://api.redscrape.com/api/public/reseller/meUsing a dedicated header means a key embedded in your storefront cannot reach your own billing endpoints. Regenerating the key invalidates the previous one immediately.
| Header | Scope |
|---|---|
X-API-Key | Your own account: products, subscriptions, payments |
X-Reseller-Key | Reseller only: customer packages |
Requests without a valid key return 401. A valid key on an account whose
reseller access was switched off returns 403.
Base URL
https://api.redscrape.com/api/public/resellerWhat you can resell
Datacenter and residential products only. Mobile and trial products are not resellable.
Account
GET /me
Wallet balance, package counts and total traffic sold.
curl -H "X-Reseller-Key: your_reseller_key" \
https://api.redscrape.com/api/public/reseller/me{
"reseller_id": 481920374,
"username": "acme",
"enabled": true,
"package_limit": 0,
"packages_total": 42,
"packages_by_status": { "active": 38, "suspended": 3, "cancelled": 1 },
"data_used_gb": 1284.5,
"data_limit_gb": 4200.0,
"wallet_balance": "620.40",
"resellable_categories": ["datacenter", "residential"]
}Catalogue and pricing
GET /catalog
Products you may resell, with the GB range and billing periods each accepts.
{
"items": [
{
"category_slug": "datacenter",
"product_slug": "datacenter-gb",
"product_name": "Datacenter GB",
"data_configurable": true,
"min_gb": 10.0,
"max_gb": 20000.0,
"billing_periods": ["one-time"]
}
]
}POST /quote
Price a configuration without buying it.
curl -X POST -H "X-Reseller-Key: your_reseller_key" \
-H "Content-Type: application/json" \
-d '{"product_slug":"residential-basic","data_gb":50}' \
https://api.redscrape.com/api/public/reseller/quote{
"product_slug": "residential-basic",
"category_slug": "residential",
"billing_period": "one-time",
"data_gb": "50",
"price_usd": "42.50"
}Packages
POST /packages
Buy and provision a package. Charged to your wallet balance and provisioned synchronously, so the response already contains working credentials.
| Field | Type | Notes |
|---|---|---|
product_slug | string | Required |
billing_period | string | Defaults to one-time |
data_gb | number | Required for data-metered products |
threads | integer | Optional, product dependent |
customer_email | string | Optional, your customer's email |
customer_reference | string | Optional, your own order id |
activate | boolean | false provisions in pending state |
curl -X POST -H "X-Reseller-Key: your_reseller_key" \
-H "Content-Type: application/json" \
-d '{
"product_slug": "residential-basic",
"data_gb": 50,
"customer_email": "[email protected]",
"customer_reference": "order-1042"
}' \
https://api.redscrape.com/api/public/reseller/packages{
"id": 118,
"category": "residential",
"product_name": "Residential Basic",
"customer_email": "[email protected]",
"customer_reference": "order-1042",
"username": "u481920374s9931",
"password": "hT3xQ9mLpZ2v",
"proxy_host": "gate.redscrape.com",
"proxy_port": 1337,
"status": "active",
"threads": 5000,
"traffic_limit_gb": 50.0,
"current_usage_gb": 0.0,
"remaining_gb": 50.0,
"usage_percent": 0.0,
"cost_usd": "42.50",
"created_at": "2026-07-27T09:14:22+00:00",
"active_until": null
}A 422 with Insufficient wallet balance means you need to top up before
provisioning. Nothing is created in that case.
GET /packages
Paginated list of everything you have sold.
Query parameters: page, per_page (max 100), status, category,
search (matches customer email, username or your reference).
{
"items": [ { "id": 118, "status": "active" } ],
"meta": { "total": 42, "page": 1, "per_page": 20, "pages": 3 }
}GET /packages/{id}
One package including credentials and current usage.
GET /packages/{id}/usage
Usage only, without credentials. Pass ?sync=true to pull fresh counters from
the upstream provider before responding.
{
"id": 118,
"username": "u481920374s9931",
"status": "active",
"traffic_limit_gb": 50.0,
"current_usage_gb": 12.84,
"remaining_gb": 37.16,
"usage_percent": 25.7,
"last_synced_at": "2026-07-27T11:02:10+00:00"
}sync=true calls the upstream provider, so keep it for on-demand refreshes
rather than tight polling loops. Datacenter packages are metered locally and
ignore the flag.
Lifecycle
| Endpoint | Effect |
|---|---|
POST /packages/{id}/activate | Move pending or suspended → active |
POST /packages/{id}/suspend | Disable without deleting; traffic stops |
POST /packages/{id}/cancel | Terminate permanently |
POST /packages/{id}/rotate-password | Issue a new proxy password |
POST /packages/{id}/topup | Add GB, charged to your wallet |
Statuses: pending, active, suspended, expired, cancelled. A
cancelled package cannot be reactivated.
Suspending a non-paying customer
curl -X POST -H "X-Reseller-Key: your_reseller_key" \
https://api.redscrape.com/api/public/reseller/packages/118/suspendTopping up traffic
curl -X POST -H "X-Reseller-Key: your_reseller_key" \
-H "Content-Type: application/json" \
-d '{"data_gb": 25}' \
https://api.redscrape.com/api/public/reseller/packages/118/topupFor residential packages this also extends the upstream order, so the extra GB is usable straight away.
Rate limits
| Endpoint | Limit |
|---|---|
POST /packages | 30 requests / minute |
POST /packages/{id}/topup | 30 requests / minute |
| Everything else | No explicit limit |
Errors
| Status | Meaning |
|---|---|
401 | Missing X-Reseller-Key |
403 | Invalid key, or reseller access disabled |
404 | Package does not exist, or is not yours |
422 | Validation failure: insufficient balance, package limit reached, bad GB amount |