STABLEVPS API
Integrate Forex VPS provisioning directly into your platform. Create, manage, and control VPS instances programmatically — no dashboard required.
REST API
Standard HTTP/JSON interface, works with any language
API Keys
Bearer token auth, scoped permissions, up to 10 keys
6 Locations
Amsterdam, London, Frankfurt, New York, Singapore, Tokyo
https://stablevps.comAll endpoints are prefixed with
/api/v1/. Responses are JSON.⚡ Quickstart
Provision your first VPS in 3 steps.
Get an API key
Call POST /api/v1/auth with your credentials, or go to your dashboard.
curl -X POST https://stablevps.com/api/v1/auth \
-H "Content-Type: application/json" \
-d '{"email":"you@example.com","password":"••••","name":"My App"}'
# → { "apiKey": "svps_live_..." }Top up your wallet
Visit Dashboard → Add Funds. VPS creation via API uses wallet balance only.
curl https://stablevps.com/api/v1/wallet \
-H "Authorization: Bearer svps_live_..."
# → { "balance": 100.00, "currency": "EUR" }Create a VPS
Provision a VPS and poll until active.
# Create
curl -X POST https://stablevps.com/api/v1/vps \
-H "Authorization: Bearer svps_live_..." \
-H "Content-Type: application/json" \
-d '{"planId":"basic","billingCycle":"monthly","location":"amsterdam"}'
# Poll until vpsStatus === "active"
curl https://stablevps.com/api/v1/vps/<id> \
-H "Authorization: Bearer svps_live_..."🔑 Authentication
All API endpoints (except POST /api/v1/auth) require an API key passed in the Authorization header.
# Option A — Bearer token
Authorization: Bearer svps_live_xxxxxxxxxxxx
# Option B — Custom header
X-API-Key: svps_live_xxxxxxxxxxxx
Read + write. Can create/delete VPS, perform actions.
Read-only. Can list/view resources, cannot modify.
/api/v1/authEmail + PasswordAuthenticates with email + password and returns a new API key. The raw key is only returned once — store it securely. Up to 10 keys per account.
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| string | required | Account email address | |
| password | string | required | Account password |
| name | string | required | A label for the key, e.g. "My Bot" |
| scope | string | optional | Permission scope"full" | "read" — default: "full" |
| expiresInDays | number | optional | Validity in days. Omit for no expiry. |
Response — 200 / 201
{
"apiKey": "svps_live_a3f7c2...",
"keyPrefix": "svps_live_a3f7",
"name": "My Bot",
"scope": "full",
"expiresAt": null,
"message": "Store this key safely — it will not be shown again."
}Examples
curl -X POST https://stablevps.com/api/v1/auth \
-H "Content-Type: application/json" \
-d '{
"email": "you@example.com",
"password": "YourPassword",
"name": "My Bot",
"scope": "full"
}'/api/v1/authAPI Key RequiredReturns metadata for all API keys on the account. The raw key is never returned — only the prefix for identification.
Response — 200 / 201
{
"keys": [
{
"_id": "664abc...",
"name": "My Bot",
"keyPrefix": "svps_live_a3f7",
"scope": "full",
"lastUsedAt": "2026-05-10T14:32:00.000Z",
"expiresAt": null,
"createdAt": "2026-05-01T09:00:00.000Z"
}
]
}Examples
curl https://stablevps.com/api/v1/auth \
-H "Authorization: Bearer svps_live_xxxx..."/api/v1/authAPI Key RequiredPermanently revokes a key. You cannot revoke the key currently used to make this request.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| keyId | string | required | The MongoDB `_id` of the key to revoke |
Response — 200 / 201
{ "success": true, "message": "API key revoked" }Examples
curl -X DELETE "https://stablevps.com/api/v1/auth?keyId=664abc..." \
-H "Authorization: Bearer svps_live_xxxx..."🖥️ VPS
Provision, inspect, and control VPS instances.
/api/v1/vpsAPI Key RequiredReturns all VPS services attached to the authenticated account.
Response — 200 / 201
{
"vps": [
{
"id": "6641abc...",
"planId": "prime",
"billingCycle": "monthly",
"status": "active",
"vpsStatus": "active",
"ipAddress": "185.12.34.56",
"location": "amsterdam",
"rdpUsername": "Administrator",
"serverId": "zomro-12345",
"currentPeriodEnd": "2026-06-11T09:00:00.000Z",
"createdAt": "2026-05-11T09:00:00.000Z"
}
],
"total": 1
}Examples
curl https://stablevps.com/api/v1/vps \
-H "Authorization: Bearer svps_live_xxxx..."/api/v1/vpsAPI Key Requiredscope: fullProvisions a new Forex VPS and deducts the cost from the wallet balance. The VPS is provisioned asynchronously — poll `GET /api/v1/vps/:id` until `vpsStatus` is `"active"`.
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| planId | string | required | Plan identifier"basic" | "prime" | "pro" |
| billingCycle | string | required | Billing cycle"monthly" | "yearly" |
| location | string | required | Datacenter location"amsterdam" | "london" | "frankfurt" | "newYork" | "singapore" | "tokyo" |
Response — 200 / 201
{
"success": true,
"message": "VPS provisioning started. It will be active in a few minutes.",
"id": "6641abc...",
"vpsId": "zomro-67890",
"planId": "prime",
"billingCycle": "monthly",
"location": "amsterdam",
"vpsStatus": "provisioning",
"rdpUsername": "Administrator",
"cost": 19.49,
"newBalance": 80.51,
"currency": "EUR",
"currentPeriodEnd": "2026-06-11T09:00:00.000Z"
}Examples
curl -X POST https://stablevps.com/api/v1/vps \
-H "Authorization: Bearer svps_live_xxxx..." \
-H "Content-Type: application/json" \
-d '{
"planId": "prime",
"billingCycle": "monthly",
"location": "amsterdam"
}'/api/v1/vps/:idAPI Key RequiredRetrieves the current state of a VPS, including live data from the provider (IP address, hostname).
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | The MongoDB service `_id` returned when creating the VPS |
Response — 200 / 201
{
"id": "6641abc...",
"planId": "prime",
"billingCycle": "monthly",
"status": "active",
"vpsStatus": "active",
"ipAddress": "185.12.34.56",
"hostname": "vps-john-1715420400000",
"rdpUsername": "Administrator",
"rdpPassword": "••••••••",
"location": "amsterdam",
"serverId": "zomro-67890",
"currentPeriodStart": "2026-05-11T09:00:00.000Z",
"currentPeriodEnd": "2026-06-11T09:00:00.000Z",
"createdAt": "2026-05-11T09:00:00.000Z"
}Examples
curl https://stablevps.com/api/v1/vps/6641abc... \
-H "Authorization: Bearer svps_live_xxxx..."/api/v1/vps/:idAPI Key Requiredscope: fullTerminates and permanently removes a VPS. This action is irreversible and no refund is issued for the remaining period.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | The MongoDB service `_id` |
Response — 200 / 201
{
"success": true,
"message": "VPS terminated successfully",
"id": "6641abc...",
"providerDeleted": true
}Examples
curl -X DELETE https://stablevps.com/api/v1/vps/6641abc... \
-H "Authorization: Bearer svps_live_xxxx..."/api/v1/vps/:id/actionsAPI Key Requiredscope: fullSend a control action to a VPS: `start`, `stop`, or `reboot`.
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| id | string | required | The MongoDB service `_id` |
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| action | string | required | Action to perform"start" | "stop" | "reboot" |
Response — 200 / 201
{
"success": true,
"action": "reboot",
"vpsId": "zomro-67890",
"message": "VPS reboot request sent successfully"
}Examples
curl -X POST https://stablevps.com/api/v1/vps/6641abc.../actions \
-H "Authorization: Bearer svps_live_xxxx..." \
-H "Content-Type: application/json" \
-d '{"action": "reboot"}'👤 Account
Retrieve account profile and wallet balance.
/api/v1/accountAPI Key RequiredReturns profile information and VPS count summary for the authenticated account.
Response — 200 / 201
{
"id": "6630abc...",
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"role": "user",
"balance": 100.00,
"currency": "EUR",
"referralCode": "JOHN2026",
"affiliateStats": {
"totalReferrals": 3,
"successfulReferrals": 2,
"totalEarnings": 3.90
},
"activeVpsCount": 1,
"totalVpsCount": 2,
"createdAt": "2026-01-01T00:00:00.000Z"
}Examples
curl https://stablevps.com/api/v1/account \
-H "Authorization: Bearer svps_live_xxxx..."/api/v1/walletAPI Key RequiredReturns the current EUR wallet balance. The wallet is the only payment method available via API.
Response — 200 / 201
{ "balance": 100.00, "currency": "EUR" }Examples
curl https://stablevps.com/api/v1/wallet \
-H "Authorization: Bearer svps_live_xxxx..."⚠️ Errors
All errors return a JSON body with an error field.
{ "error": "Insufficient wallet balance", "required": 19.49, "available": 5.00, "currency": "EUR" }| Status | Meaning |
|---|---|
| 200 / 201 | Success |
| 400 | Bad request — missing or invalid parameters |
| 401 | Unauthorized — missing, invalid or expired API key |
| 402 | Payment required — insufficient wallet balance |
| 403 | Forbidden — read-only key used on a write endpoint |
| 404 | Not found — resource does not exist or belongs to another account |
| 429 | Rate limited — max 10 API keys per account |
| 500 | Internal server error |
| 502 | Provider error — the VPS provider returned a failure |
đź’¶ Plans & Pricing
Use these planId values when creating a VPS.
| planId | Name | CPU | RAM | Storage | Monthly | Yearly |
|---|---|---|---|---|---|---|
| basic | Starter | 1 vCPU | 2.5 GB | 17 GB NVMe | €12.49 | €124.90 |
| prime | Professional | 2 vCPU | 4 GB | 35 GB NVMe | €19.49 | €194.90 |
| pro | Enterprise | 4 vCPU | 8 GB | 65 GB NVMe | €34.49 | €344.90 |
All prices in EUR. Windows Server 2022 included. MT5 pre-installed.
🌍 Locations
amsterdam
Amsterdam
london
London
frankfurt
Frankfurt
newYork
New York
singapore
Singapore
tokyo
Tokyo
🚀 Use Cases
Integrate VPS sales into your SaaS
Let your users purchase Forex VPS directly from your platform — you handle billing, we handle provisioning.
// 1. Your backend creates a VPS when user pays
async function onUserPaid(userId, plan) {
const res = await fetch('https://stablevps.com/api/v1/vps', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.STABLEVPS_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
planId: plan, // 'basic' | 'prime' | 'pro'
billingCycle: 'monthly',
location: 'amsterdam',
}),
});
const vps = await res.json();
await db.users.update(userId, { vpsId: vps.id });
}
// 2. Poll and deliver credentials to your user
async function awaitAndDeliver(vpsId, userId) {
let vps;
while (true) {
const r = await fetch(`https://stablevps.com/api/v1/vps/${vpsId}`, {
headers: { Authorization: `Bearer ${process.env.STABLEVPS_API_KEY}` },
});
vps = await r.json();
if (vps.vpsStatus === 'active') break;
await new Promise(r => setTimeout(r, 15000)); // wait 15s
}
await sendEmail(userId, {
ip: vps.ipAddress,
user: vps.rdpUsername,
pass: vps.rdpPassword,
});
}Auto-reboot monitoring bot
import requests, time
API_KEY = 'svps_live_...'
HEADERS = {'Authorization': f'Bearer {API_KEY}'}
def monitor():
vps_list = requests.get(
'https://stablevps.com/api/v1/vps', headers=HEADERS
).json()['vps']
for vps in vps_list:
if vps['vpsStatus'] != 'active':
print(f"VPS {vps['id']} is down, rebooting...")
requests.post(
f"https://stablevps.com/api/v1/vps/{vps['id']}/actions",
json={'action': 'reboot'},
headers=HEADERS,
)
while True:
monitor()
time.sleep(60) # check every minuteShell alias for quick management
# ~/.bashrc or ~/.zshrc
export SVPS_KEY="svps_live_..."
alias svps-list='curl -s https://stablevps.com/api/v1/vps -H "Authorization: Bearer $SVPS_KEY" | jq'
alias svps-balance='curl -s https://stablevps.com/api/v1/wallet -H "Authorization: Bearer $SVPS_KEY" | jq'
svps-reboot() { curl -s -X POST "https://stablevps.com/api/v1/vps/$1/actions" \
-H "Authorization: Bearer $SVPS_KEY" -H "Content-Type: application/json" \
-d '{"action":"reboot"}' | jq; }
# Usage:
svps-list
svps-balance
svps-reboot 6641abc...STABLEVPS API v1 · stablevps.com
Questions? Open a support ticket.