Lifecycle and metadata for every service on your account. Filter by kind to focus on VPS, dedicated, storage boxes, LIRs, etc. The list response also surfaces your quota and a real-time hourly spend summary.
GET/api/reseller/v1/services
List your services, newest first, plus current quota and hourly billing summary.
Auth: Reseller sessionSuccess: 200
quota.vps.limit is null for PREPAID resellers and for POSTPAID resellers configured with no cap.hourly.hoursRemaining is a number for PREPAID with non-zero rate (balance ÷ rate), and null otherwise.nextDueAt is null for hourly services and for storage boxes; it is set on monthly subscriptions only.
Query parameters
kindstring— Filter. One of VPS, DEDICATED, HETZNER_SERVER, HETZNER_STORAGEBOX, LIR, CUSTOM.
statusstring— Filter. One of PENDING, ACTIVE, SUSPENDED, TERMINATED.
limitnumber— 1–100 (default 50).
offsetnumber— ≥ 0 (default 0).
Example request
curl -H "Cookie: $SESSION" \
"https://aluy.net/api/reseller/v1/services?kind=VPS&status=ACTIVE"
Successful response
{
"services": [
{
"id": "clxsvc...",
"kind": "VPS",
"status": "ACTIVE",
"label": "edge-fi-01",
"externalId": "1234",
"createdAt": "2026-04-23T14:08:11.123Z",
"nextDueAt": null,
"subscriptionBillingPeriod": "HOURLY",
"subscriptionCancelledAt": null,
"hourlyRateCents": 7,
"lastBilledAt": "2026-04-23T15:00:00.000Z",
"billedHourlyCents": 7,
"pendingInvoiceCents": 0,
"pendingInvoiceSeconds": 0,
"pendingInvoiceSince": null
}
],
"total": 12,
"limit": 50,
"offset": 0,
"quota": {
"vps": { "used": 12, "limit": 25 },
"billingMode": "POSTPAID"
},
"hourly": {
"billingMode": "POSTPAID",
"balanceCents": 4250,
"totalHourlyRateCents": 84,
"hoursRemaining": null,
"activeHourlyServices": 12,
"pendingInvoiceCents": 1260
}
}Common errors
400Unknown kind or status.
{ "error": "Invalid kind. Valid values: VPS, DEDICATED, HETZNER_SERVER, HETZNER_STORAGEBOX, LIR, CUSTOM" }GET/api/reseller/v1/services/:id
Single-service detail with parsed metadata and a flag that surfaces failed provisioning attempts (so you can decide whether to call retry-provision).
Auth: Reseller sessionSuccess: 200
metadata.provisionError is stripped from this response; check hasProvisionIssue to know if it's present internally.
Example request
curl -H "Cookie: $SESSION" \
https://aluy.net/api/reseller/v1/services/clxsvc...
Successful response
{
"service": {
"id": "clxsvc...",
"kind": "VPS",
"status": "ACTIVE",
"label": "edge-fi-01",
"externalId": "1234",
"metadata": {
"vmType": "custom",
"vmLocation": "fi-hel",
"ramGb": 4, "cpuCores": 2, "ssdGb": 60
},
"createdAt": "2026-04-23T14:08:11.123Z",
"nextDueAt": null,
"subscriptionBillingPeriod": "HOURLY",
"subscriptionCancelledAt": null,
"hourlyRateCents": 7,
"billedRunningSeconds": 3600,
"billedHourlyCents": 7,
"lastBilledAt": "2026-04-23T15:00:00.000Z",
"pendingInvoiceCents": 0,
"pendingInvoiceSeconds": 0,
"pendingInvoiceSince": null,
"hasProvisionIssue": false
}
}Common errors
404Service does not exist or is not yours.
{ "error": "Service not found" }PATCH/api/reseller/v1/services/:id
Update the display label of a service. For VPS, the new label is also pushed to the hypervisor as the server name (best-effort — failures are logged but do not fail the request).
Auth: Reseller sessionSuccess: 200
Request body (JSON)
labelstringrequired— 1–200 chars after trim.
Example request
curl -X PATCH -H "Cookie: $SESSION" -H "Content-Type: application/json" \
-d '{"label":"client-acme-edge-01"}' \
https://aluy.net/api/reseller/v1/services/clxsvc...Successful response
{
"service": {
"id": "clxsvc...",
"label": "client-acme-edge-01",
"kind": "VPS",
"status": "ACTIVE"
}
}Common errors
400No label was supplied (or the value is empty/too long).
{ "error": "No valid fields to update" }POST/api/reseller/v1/services/:id/cancel
Cancel automatic renewal. The service stays active until the end of the current billing period; sets subscriptionCancelledAt to now.
Auth: Reseller sessionSuccess: 200
Example request
curl -X POST -H "Cookie: $SESSION" \
https://aluy.net/api/reseller/v1/services/clxsvc.../cancel
Successful response
{
"service": {
"id": "clxsvc...",
"label": "edge-fi-01",
"status": "ACTIVE",
"subscriptionCancelledAt": "2026-04-23T14:30:00.000Z"
}
}Common errors
400Service is already TERMINATED.
{ "error": "Service is already terminated" }POST/api/reseller/v1/services/:id/resumeVPS only
Reverse a cancellation that hasn't taken effect yet. Clears subscriptionCancelledAt so the next billing cycle renews normally.
Auth: Reseller sessionSuccess: 200
Example request
curl -X POST -H "Cookie: $SESSION" \
https://aluy.net/api/reseller/v1/services/clxsvc.../resume
Successful response
{ "ok": true }Common errors
400The service was never cancelled.
{ "error": "Service is not cancelled" }POST/api/reseller/v1/services/:id/suspendVPS only
Power off the VPS and mark it suspended. Use this to pause a downstream client without terminating the server.
Auth: Reseller sessionSuccess: 200
Example request
curl -X POST -H "Cookie: $SESSION" \
https://aluy.net/api/reseller/v1/services/clxsvc.../suspend
Successful response
{ "ok": true, "serviceId": "clxsvc..." }Common errors
409The service has not been provisioned yet (no externalId).
{ "error": "Service not yet provisioned" }502The hypervisor rejected the suspend request.
{ "error": "<upstream message>" }POST/api/reseller/v1/services/:id/unsuspendVPS only
Restore a suspended VPS. Marks the service ACTIVE and powers it back on.
Auth: Reseller sessionSuccess: 200
Example request
curl -X POST -H "Cookie: $SESSION" \
https://aluy.net/api/reseller/v1/services/clxsvc.../unsuspend
Successful response
{ "ok": true, "serviceId": "clxsvc..." }Common errors
502The hypervisor rejected the unsuspend request.
{ "error": "<upstream message>" }POST/api/reseller/v1/services/:id/reset-passwordVPS only
Reset the root/admin password for the VPS. Returns the new password in plaintext exactly once — store it securely; we do not retain it.
Auth: Reseller sessionSuccess: 200
Example request
curl -X POST -H "Cookie: $SESSION" \
https://aluy.net/api/reseller/v1/services/clxsvc.../reset-password
Successful response
{ "ok": true, "password": "Q9!t2R-u-pVnR3mJh8zX" }Common errors
502The hypervisor rejected the request.
{ "error": "Upstream provider error" }POST/api/reseller/v1/services/:id/retry-provisiondestructive
Re-run provisioning for a service that was created but failed to deploy upstream. Deletes the current service row, then re-issues the provisioning side-effects from the original order. Only valid while status is PENDING.
Auth: Reseller sessionSuccess: 200
- Use this only when
GET /services/:id reports hasProvisionIssue: true. The original id stops existing — capture serviceId from this response and use that going forward. - Calling twice in quick succession can interleave badly with the still-running first attempt. Wait for the first response before retrying.
Example request
curl -X POST -H "Cookie: $SESSION" \
https://aluy.net/api/reseller/v1/services/clxsvc.../retry-provision
Successful response
{
"ok": true,
"serviceId": "clxsvcNEW...",
"status": "ACTIVE"
}Common errors
400Service is not in PENDING state.
{ "error": "Only pending services can be retried" }400The original order can't be located in metadata.
{ "error": "Cannot retry — missing order information" }409The service is still being set up (no provisionError yet).
{ "error": "Service is still being set up — please wait" }POST/api/reseller/v1/services/:id/upgradeVPS only
Increase the resources of an ACTIVE VPS. Send only the dimensions you want to grow; downgrades are not supported. Resource upgrades create a new upgrade order; extra IPs create a separate add-on order.
Auth: Reseller sessionSuccess: 200
upgradeOrderId and extraIpOrderId are only present when that branch ran. At least one is always present on a 200.
Request body (JSON)
ramGbnumber— New RAM in GB. Must be greater than current.
cpuCoresnumber— New vCPU count. Must be greater than current.
ssdGbnumber— New SSD in GB. Must be greater than current.
extraIpv4number— Number of additional IPv4 addresses to add (each creates a recurring line).
Example request
curl -X POST -H "Cookie: $SESSION" -H "Content-Type: application/json" \
-d '{"ramGb":8, "extraIpv4":1}' \
https://aluy.net/api/reseller/v1/services/clxsvc.../upgradeSuccessful response
{
"ok": true,
"upgradeOrderId": "clxord...",
"extraIpOrderId": "clxord..."
}Common errors
400No upgrade fields supplied.
{ "error": "At least one upgrade field is required (ramGb, cpuCores, ssdGb, extraIpv4)" }400Resource upgrade path failed validation/availability.
{ "error": "Upgrade not available" }400Extra IP order failed.
{ "error": "Extra IP order failed" }409Service is not ACTIVE.
{ "error": "Service must be active to upgrade" }POST/api/reseller/v1/services/:id/reinstallVPS onlydestructive
Wipe and reinstall the VPS with a different OS template. Destructive — all data on the server is lost. Triggers the standard reinstall notification email in the background.
Auth: Reseller sessionSuccess: 200
Request body (JSON)
operatingSystemIdnumberrequired— VirtFusion template id (see GET /services/:id/templates).
hostnamestring— Optional. Hostname to set on the new install.
Example request
curl -X POST -H "Cookie: $SESSION" -H "Content-Type: application/json" \
-d '{"operatingSystemId":42, "hostname":"edge-fi-01.example.com"}' \
https://aluy.net/api/reseller/v1/services/clxsvc.../reinstallSuccessful response
{ "ok": true, "serviceId": "clxsvc..." }Common errors
400operatingSystemId missing or not a number.
{ "error": "operatingSystemId is required" }502Upstream rejected the reinstall.
{ "error": "Upstream provider error" }