Reseller API
For approved members of the NGP Cloud reseller program. Create servers, web hosting, databases, VPS and domains for your own customers. Everything is paid from your prepaid balance at retail less your discount, belongs to your account, and renews from your balance.
Authenticate with an API key from Dashboard > API, sent as Authorization: Bearer ngp_.... The same key also works for the customer API. Requests are limited to 60 a minute per key. Top up your balance from Dashboard > Reseller.
Errors come back as { "error": "..." } with a matching status: 400 bad request, 402 balance too low (with price and balance), 403 not an active reseller, 404 not found, 409 conflict, 502 the service couldn't be set up (already refunded).
Account
/api/v1/reseller/accountYour tier, discount and balance.
curl -X GET "https://ngpcloud.in/api/v1/reseller/account" \ -H "Authorization: Bearer ngp_your_api_key"
Response
{ "brand_name": "YourBrand", "tier": "starter", "discount_percent": 15, "balance": 2500, "currency": "INR", "status": "active" }/api/v1/reseller/ledger?limit=100Every change to your balance, newest first: top-ups, charges, renewals, refunds.
curl -X GET "https://ngpcloud.in/api/v1/reseller/ledger?limit=100" \ -H "Authorization: Bearer ngp_your_api_key"
What you can sell
/api/v1/reseller/catalogEvery plan with its retail price and your price for each processor line (game and bot servers), plus the VPS plans. Prices are per month; 3 months cost 3 x less 5%, 12 months 12 x less 20%.
curl -X GET "https://ngpcloud.in/api/v1/reseller/catalog" \ -H "Authorization: Bearer ngp_your_api_key"
/api/v1/reseller/server-typesThe game and bot server types (nest_id and egg_id) a server can be created with, and any value one needs at creation (for example a CS:GO Steam token).
curl -X GET "https://ngpcloud.in/api/v1/reseller/server-types" \ -H "Authorization: Bearer ngp_your_api_key"
/api/v1/reseller/domains/check?domain=example.comWhether a domain is free, its retail price and your price for one year.
curl -X GET "https://ngpcloud.in/api/v1/reseller/domains/check?domain=example.com" \ -H "Authorization: Bearer ngp_your_api_key"
Your customers
Optional: group services by customer, and give a customer game panel access to their server.
/api/v1/reseller/customersList your customers.
curl -X GET "https://ngpcloud.in/api/v1/reseller/customers" \ -H "Authorization: Bearer ngp_your_api_key"
/api/v1/reseller/customersAdd a customer. external_ref is your own id for them (unique per reseller).
curl -X POST "https://ngpcloud.in/api/v1/reseller/customers" \
-H "Authorization: Bearer ngp_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "name": "Steve", "email": "[email protected]", "external_ref": "cust_1042" }'/api/v1/reseller/customers/:idChange a customer's name, email or external_ref.
curl -X PATCH "https://ngpcloud.in/api/v1/reseller/customers/8d2e..." \ -H "Authorization: Bearer ngp_your_api_key"
/api/v1/reseller/customers/:idRemove a customer who has no running services.
curl -X DELETE "https://ngpcloud.in/api/v1/reseller/customers/8d2e..." \ -H "Authorization: Bearer ngp_your_api_key"
Services
A new service is paid from your balance at your price straight away. If it can't be set up, the money goes back to your balance automatically. Services auto-renew from your balance 2 days before they expire (turn it off per service); if the balance is short you get a notification, and an unpaid service is suspended like any other.
/api/v1/reseller/servicesCreate a game or bot server, web hosting, a database or a VPS. Game and bot servers need nest_id and egg_id (server-types); processor is INTEL, AMD_EPYC or AMD_RYZEN where available. For a custom server send custom: { ram, cpu, storage } instead of plan. A VPS needs plan_id (catalog) and os, and is set up by NGP Cloud staff (status pending_setup until ready). With customer_id, that customer is given game panel access unless panel_access is false.
curl -X POST "https://ngpcloud.in/api/v1/reseller/services" \
-H "Authorization: Bearer ngp_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "category": "Minecraft", "plan": "Starter", "billing_duration": 1, "processor": "INTEL", "nest_id": 1, "egg_id": 3, "server_version": "1.21.4", "label": "Steve SMP", "customer_id": "c1f0...", "auto_renew": true }'Response
{ "service": { "id": "8d2e...", "kind": "server", "status": "active", "label": "Steve SMP", "expires_at": "...", "price": { "retail_per_period": 299, "paid_first_period": 254.15 }, "server": { "identifier": "a1b2c3d4", "panel_url": "https://panel.ngpcloud.in/server/a1b2c3d4" } } }/api/v1/reseller/services?customer_id=...Your services with their live status (active, overdue, suspended, pending_setup, terminated...).
curl -X GET "https://ngpcloud.in/api/v1/reseller/services?customer_id=..." \ -H "Authorization: Bearer ngp_your_api_key"
/api/v1/reseller/services/:idOne service.
curl -X GET "https://ngpcloud.in/api/v1/reseller/services/8d2e..." \ -H "Authorization: Bearer ngp_your_api_key"
/api/v1/reseller/services/:idRename it (label; renames the server on the panel too), move it to another customer, or turn auto_renew on or off.
curl -X PATCH "https://ngpcloud.in/api/v1/reseller/services/8d2e..." \
-H "Authorization: Bearer ngp_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "label": "Steve SMP 2", "auto_renew": false }'/api/v1/reseller/services/:id/renewRenew now for 1 to 12 months from your balance; brings back a server held for non-payment.
curl -X POST "https://ngpcloud.in/api/v1/reseller/services/8d2e.../renew" \
-H "Authorization: Bearer ngp_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "months": 3 }'/api/v1/reseller/services/:id/suspendSuspend a game or bot server or hosting account (for example when your customer hasn't paid you). /unsuspend brings it back.
curl -X POST "https://ngpcloud.in/api/v1/reseller/services/8d2e.../suspend" \ -H "Authorization: Bearer ngp_your_api_key"
/api/v1/reseller/services/:id/powerStart, stop, restart or kill a game or bot server.
curl -X POST "https://ngpcloud.in/api/v1/reseller/services/8d2e.../power" \
-H "Authorization: Bearer ngp_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "action": "restart" }'/api/v1/reseller/services/:idTerminate a service for good: the server or hosting account and its data are deleted. There is no refund for unused time.
curl -X DELETE "https://ngpcloud.in/api/v1/reseller/services/8d2e..." \ -H "Authorization: Bearer ngp_your_api_key"
Game panel access
/api/v1/reseller/services/:id/panel-accessGive your customer (or any email) access to the server on the game panel: console, files, backups, databases, schedules and startup settings, but not managing other users. If the email has no panel login yet, the panel emails it a link to set a password.
curl -X POST "https://ngpcloud.in/api/v1/reseller/services/8d2e.../panel-access" \
-H "Authorization: Bearer ngp_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "customer_id": "c1f0..." }'/api/v1/reseller/services/:id/panel-access/:emailTake that access away.
curl -X DELETE "https://ngpcloud.in/api/v1/reseller/services/8d2e.../panel-access/[email protected]" \ -H "Authorization: Bearer ngp_your_api_key"
Domains
/api/v1/reseller/domainsRegister a domain for one year from your balance. Domains renew through NGP Cloud support.
curl -X POST "https://ngpcloud.in/api/v1/reseller/domains" \
-H "Authorization: Bearer ngp_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "domain": "stevesmp.in", "customer_id": "c1f0..." }'Webhooks
Set an https URL in Dashboard > Reseller > Webhook and we POST a JSON event to it when something happens. The first time you save a URL you get a signing secret (shown once; make a new one any time). Each event is sent once, with a 10-second timeout and no redirects: if your server misses one, the API has the same information.
order.paid: a customer paid a store order (before it is set up).service.created: a service was set up, from the API or your store.service.renewed: a service was renewed (by you, auto-renew, or a store customer).service.expiring: 3 days, 1 day and the day before a service that doesn't auto-renew expires.service.expired: a service passed its expiry unpaid; it is suspended until renewed.balance.low: your balance dropped below your low-balance alert.test: sent by the "Send a test event" button.
Check every event: X-Webhook-Signature is sha256= followed by the HMAC-SHA256 of X-Webhook-Timestamp + "." + the raw body with your secret. Reject events whose timestamp is more than 5 minutes old.
POST https://yourbrand.com/webhooks/hosting
Content-Type: application/json
X-Webhook-Event: service.created
X-Webhook-Timestamp: 1794300000
X-Webhook-Signature: sha256=5f1c...
{ "id": "evt_...", "event": "service.created", "created_at": "2026-11-10T10:00:00.000Z", "data": { "service": { "id": "...", "status": "active", ... } } }// Node.js (Express): verify before trusting the event
import crypto from 'node:crypto';
app.post('/webhooks/hosting', express.raw({ type: 'application/json' }), (req, res) => {
const timestamp = req.get('X-Webhook-Timestamp');
const expected = 'sha256=' + crypto.createHmac('sha256', process.env.WEBHOOK_SECRET)
.update(timestamp + '.' + req.body.toString('utf8')).digest('hex');
const given = req.get('X-Webhook-Signature') || '';
const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) < 300;
if (!fresh || given.length !== expected.length || !crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected))) {
return res.sendStatus(401);
}
const event = JSON.parse(req.body.toString('utf8'));
// ... handle event.event / event.data
res.sendStatus(200);
});