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 API key or sessionSuccess: 200
- Resource limits are
null for PREPAID resellers and for any explicitly unlimited POSTPAID dimension. Use GET /quota for growth dates. 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 "Authorization: Bearer $KEY" \
"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,
"maxSpendCents": 1000,
"resourceAllocation": {
"ramMb": 4096, "cpuCores": 2, "storageGb": 60, "ipv4": 1,
"releasedAt": null
},
"lastBilledAt": "2026-04-23T15:00:00.000Z",
"billedHourlyCents": 7,
"pendingInvoiceCents": 0,
"pendingInvoiceSeconds": 0,
"pendingInvoiceSince": null
}
],
"total": 12,
"limit": 50,
"offset": 0,
"quota": {
"resources": {
"used": { "ramMb": 27648, "cpuCores": 23, "storageGb": 300, "ipv4": 21 },
"reserved": { "ramMb": 0, "cpuCores": 0, "storageGb": 0, "ipv4": 0 },
"limits": { "ramMb": 131072, "cpuCores": 64, "storageGb": 1024, "ipv4": 64 },
"remaining": { "ramMb": 103424, "cpuCores": 41, "storageGb": 724, "ipv4": 43 }
},
"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 API key or sessionSuccess: 200
metadata is the customer view of the service: connection details (hostname, location, IPs), specs, and for a suspended service suspendReason / suspendedAt / scheduledTerminationAt. Internal provisioning and billing keys are never included.- A failed provisioning attempt is not exposed as text; check
hasProvisionIssue and call retry-provision. externalId is null once a service is TERMINATED.- Cancelling a VPS that was never delivered (still
PENDING) ends it at once: its status becomes TERMINATED and its quota is released.
Example request
curl -H "Authorization: Bearer $KEY" \
https://aluy.net/api/reseller/v1/services/clxsvc...
Successful response
{
"service": {
"id": "clxsvc...",
"kind": "VPS",
"status": "ACTIVE",
"label": "edge-fi-01",
"externalId": "1234",
"metadata": {
"hostname": "edge-fi-01.example.net",
"location": "fi",
"ip": "203.0.113.10",
"ipv4List": ["203.0.113.10"],
"ipv6List": ["2001:db8::/64"],
"cpu": 2, "ramGb": 4, "diskGb": 60
},
"createdAt": "2026-04-23T14:08:11.123Z",
"nextDueAt": null,
"subscriptionBillingPeriod": "HOURLY",
"subscriptionCancelledAt": null,
"hourlyRateCents": 7,
"maxSpendCents": 1000,
"resourceAllocation": {
"ramMb": 4096, "cpuCores": 2, "storageGb": 60, "ipv4": 1,
"releasedAt": null
},
"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 or an hourly VPS lifetime spend limit. Set maxSpendCents to null for unlimited usage.
Auth: Reseller API key or sessionSuccess: 200
Request body (JSON)
labelstring— 1–200 chars after trim.
maxSpendCentsnumber | null— Positive euro-cent limit for an hourly VPS, above billedHourlyCents; null removes the limit.
Example request
curl -X PATCH -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"maxSpendCents":2500}' \
https://aluy.net/api/reseller/v1/services/clxsvc...Successful response
{
"service": {
"id": "clxsvc...",
"label": "client-acme-edge-01",
"kind": "VPS",
"status": "ACTIVE",
"maxSpendCents": 2500,
"billedHourlyCents": 7
}
}Common errors
400label is empty after trim.
{ "error": "label cannot be empty" }400maxSpendCents is invalid or the service is not an hourly VPS.
{ "error": "maxSpendCents must be a positive integer or null" }400No supported field was sent.
{ "error": "No valid fields to update" }409maxSpendCents is not above what the VPS has already used (it would stop at once).
{ "error": "This server has already used €15.00. Set a limit above that, or remove the limit.", "code": "spend_limit_already_used" }POST/api/reseller/v1/services/:id/cancel
Cancel automatic renewal. Monthly services stay active until nextDueAt. Hourly services keep running for one more hour, then terminate. Response includes scheduledTerminationAt. Send {"when": "now"} to end an active VPS right away instead: it is deleted with its data at once and the unused part of the paid term is credited pro rata (PREPAID: to your balance; POSTPAID: a credit note lowers your invoice; hourly: nothing billed ahead). The response then carries the credit instead of scheduledTerminationAt.
Auth: Reseller API key or sessionSuccess: 200
Example request
curl -X POST -H "Authorization: Bearer $KEY" \
https://aluy.net/api/reseller/v1/services/clxsvc.../cancel
# End it now instead of at the end of the term:
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"when":"now"}' https://aluy.net/api/reseller/v1/services/clxsvc.../cancelSuccessful response
{
"service": {
"id": "clxsvc...",
"label": "edge-fi-01",
"status": "ACTIVE",
"subscriptionCancelledAt": "2026-09-14T14:30:00.000Z",
"scheduledTerminationAt": "2026-09-14T15:30:00.000Z"
}
}Common errors
400Service is already TERMINATED.
{ "error": "Service is already terminated" }400when is not "now" or "end_of_term", or "now" for a service that is not a VPS.
{ "error": "when must be \"now\" or \"end_of_term\"", "code": "invalid_request" }409"now" for a VPS that is suspended, moving or held.
{ "error": "Service is not active", "code": "conflict" }POST/api/reseller/v1/services/:id/resume
Reverse a cancellation that hasn't taken effect yet. Clears subscriptionCancelledAt so billing continues. Works for any service kind you cancelled.
Auth: Reseller API key or sessionSuccess: 200
Example request
curl -X POST -H "Authorization: Bearer $KEY" \
https://aluy.net/api/reseller/v1/services/clxsvc.../resume
Successful response
{ "ok": true }Common errors
400The service was never cancelled.
{ "error": "Subscription is not cancelled" }409Service is already TERMINATED.
{ "error": "Service is terminated and cannot be resumed. Place a new order." }POST/api/reseller/v1/services/:id/suspendVPS only
Power off the VPS and mark it SUSPENDED. This is a pause — it does not start the 7-day termination clock. Hourly billing stops while suspended. Undo with POST …/unsuspend.
Auth: Reseller API key or sessionSuccess: 200
Example request
curl -X POST -H "Authorization: Bearer $KEY" \
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 VPS you suspended with POST …/suspend, or a PREPAID hourly VPS suspended for insufficient balance once your balance covers at least one hour at its rate. Marks the service ACTIVE and powers it back on. A termination already scheduled on the service (a cancellation, or one set by Aluy) stays in place. Other suspensions made by Aluy (abuse, support, unpaid invoices, billing details) cannot be lifted through the API.
Auth: Reseller API key or sessionSuccess: 200
Example request
curl -X POST -H "Authorization: Bearer $KEY" \
https://aluy.net/api/reseller/v1/services/clxsvc.../unsuspend
Successful response
{ "ok": true, "serviceId": "clxsvc..." }Common errors
402Suspended for insufficient balance and your balance does not yet cover one hour. Top up and retry.
{ "error": "Insufficient balance to resume (need at least €0.07 for one hour, have €0.00). Top up your balance and try again.", "code": "insufficient_balance" }403The service was suspended by Aluy (abuse, support, unpaid invoice, billing details), not through the reseller API. Contact support.
{ "error": "Suspended by provider", "code": "provider_suspension" }409The hourly VPS's lifetime spend limit is exhausted.
{ "error": "Hourly spend limit reached. Raise or remove the limit before starting this server.", "code": "spend_limit_exhausted" }502The hypervisor rejected the unsuspend request.
{ "error": "<upstream message>" }POST/api/reseller/v1/services/:id/reset-passwordVPS only
Reset the login password for the VPS: root, or Administrator on a Windows server (username says which). Returns the new password in plaintext exactly once — store it securely; we do not retain it.
Auth: Reseller API key or sessionSuccess: 200
Example request
curl -X POST -H "Authorization: Bearer $KEY" \
https://aluy.net/api/reseller/v1/services/clxsvc.../reset-password
Successful response
{ "ok": true, "password": "Q9!t2R-u-pVnR3mJh8zX", "username": "root" }Common errors
409The service is not ACTIVE (e.g. suspended).
{ "error": "Service is suspended", "code": "not_active" }409This action is not available for the service right now. Contact support.
{ "error": "This action is currently unavailable, please contact support", "code": "action_unavailable" }409The server is in the last step of a move to new hardware (a few minutes).
{ "error": "Your server is in the last step of its move. This works again in a few minutes.", "code": "moving" }502The host did not carry it out. detail says why, in plain words.
{ "error": "Upstream provider error", "detail": "The server is not running." }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 API key or 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 "Authorization: Bearer $KEY" \
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" }202A failed build on our newer hosts (pve:) is rebuilt by itself: nothing to do, check the status after nextAttemptAt.
{ "ok": true, "code": "rebuild_scheduled", "serviceId": "clxsvc...", "status": "PENDING", "nextAttemptAt": "2026-10-16T22:00:00.000Z" }409A pve: build whose automatic rebuilds did not take: our team finishes it or refunds the order.
{ "error": "This build could not be completed automatically. Our team has been notified and will finish it or refund the order.", "code": "rebuild_needs_staff" }409A server was (or may have been) created upstream before the failure. Retrying would create a second one; our team reconciles it instead.
{ "error": "Provisioning may already exist at the upstream provider and must be reconciled before retrying", "code": "upstream_reconciliation_required" }POST/api/reseller/v1/services/:id/upgradeVPS only
Change RAM, CPU, SSD, and/or add extra IPv4 on an ACTIVE VPS. Hourly services apply immediately and the meter rate updates on the next tick (no prorata invoice). Monthly services create a prorata upgrade order. RAM/CPU may go down (immediate, with a prorata refund on monthly). Storage cannot shrink.
Auth: Reseller API key or sessionSuccess: 200
- Hourly:
applied: true and no order ids. Monthly: upgradeOrderId / extraIpOrderId when that branch created a prorata charge.
Request body (JSON)
ramGbnumber— New RAM in GB.
cpuCoresnumber— New vCPU count.
ssdGbnumber— New SSD in GB. Must be greater than or equal to current.
extraIpv4number— Number of additional IPv4 addresses to add.
ipv6PrefixLennumber— IPv6 prefix size on servers that support it: 64 (included), 56 or 48 (monthly add-ons). Bigger creates a prorata order (ipv6OrderId); smaller applies at once with a prorata refund to the balance. Send it on its own.
Example request
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"ramGb":8, "extraIpv4":1}' \
https://aluy.net/api/reseller/v1/services/clxsvc.../upgradeSuccessful response
{
"ok": true,
"applied": true,
"refundedToBalanceCents": 0,
"upgradeOrderId": "clxord...",
"extraIpOrderId": "clxord...",
"paidFromBalance": true,
"extraIpPaidFromBalance": true
}Common errors
400No upgrade fields supplied.
{ "error": "At least one upgrade field is required (ramGb, cpuCores, ssdGb, extraIpv4, ipv6PrefixLen)" }400Resource upgrade path failed validation/availability.
{ "error": "Upgrade not available" }400Extra IP path failed.
{ "error": "Quantity must be 1–4" }409Service is not ACTIVE.
{ "error": "Service must be active to upgrade" }POST/api/reseller/v1/services/:id/remove-ipv4VPS only
Detach one extra IPv4 and drop its recurring charge. Hourly: the meter rate drops immediately (no refund — you were never prepaid). Monthly: unused cycle days are credited to balance.
Auth: Reseller API key or sessionSuccess: 200
Request body (JSON)
ipAddressstring— Optional. Specific extra IPv4 to remove (not the primary).
quantitynumber— Optional. How many extras to drop when ipAddress is omitted (default 1).
Example request
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"quantity":1}' \
https://aluy.net/api/reseller/v1/services/clxsvc.../remove-ipv4Successful response
{
"ok": true,
"removedIps": ["203.0.113.8"],
"refundedToBalanceCents": 0,
"billedIpsRemoved": 1
}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 API key or sessionSuccess: 200
Request body (JSON)
operatingSystemIdnumberrequired— Template id (see GET /os-templates or GET /services/:id/templates).
hostnamestring— Optional. Hostname to set on the new install.
sshKeysnumber[]— Optional. Ids of your own SSH keys (see GET /ssh-keys).
Example request
curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d '{"operatingSystemId":42, "hostname":"edge-fi-01.example.com", "sshKeys":[12]}' \
https://aluy.net/api/reseller/v1/services/clxsvc.../reinstallSuccessful response
{ "ok": true, "serviceId": "clxsvc..." }Common errors
400operatingSystemId missing or not a number.
{ "error": "operatingSystemId (number) is required" }400An sshKeys id is not one of your own keys.
{ "error": "Unknown SSH key id: 99. List yours with GET /api/reseller/v1/ssh-keys." }409The service is not ACTIVE (e.g. suspended).
{ "error": "Only active services can be reinstalled", "code": "not_active" }409This action is not available for the service right now. Contact support.
{ "error": "This action is currently unavailable, please contact support", "code": "action_unavailable" }409An install of this server is still running.
{ "error": "An install is still running. Try again once it is done.", "code": "install_running" }409The server is being moved to new hardware.
{ "error": "Your server is being moved to new hardware. This is available again once the move is done — we email you when it is.", "code": "moving" }502The host did not carry it out. detail says why, in plain words.
{ "error": "Upstream provider error", "detail": "That operating system is not available on this server." }