Every bare-metal server and cloud instance on your account has its own power controls. You can reboot, shut down, hard-stop and start a machine yourself, at any hour, without a ticket. Bare metal is controlled through the server's management controller; cloud instances through the hypervisor. Both take a few seconds.
Before you press anything, know which control you need:
| Control | What happens | Use it when |
|---|---|---|
| Shutdown (bare metal) | Asks the operating system to stop, the way the power button on a desktop does. Filesystems are flushed. A hung OS can ignore it. | You want the machine off cleanly. |
| Stop | Cuts power without asking the operating system. Anything not yet written to disk is lost. | The OS is hung and Shutdown did nothing. |
| Reboot | Bare metal: a power cycle, off and on again, without asking the OS. Cloud: a reset, the same thing at the hypervisor. | The machine is unresponsive over the network. |
| Start | Powers a stopped machine on. | After a Stop or Shutdown. |
| Status (bare metal) | Reads the live power state from the management controller. Changes nothing. | The badge says Unknown, or you want to confirm an action landed. |
If you need a clean restart of a machine that still answers, log in over SSH and run reboot yourself. The portal's Reboot is deliberately the blunt tool: it is for the moment SSH no longer works.
Method 1: In the portal
Bare-metal servers
- Log in at amoni.app and open Servers in the left-hand menu.
- Click the server. The power controls sit at the top right of the page, next to the Running / Stopped badge. When the page opens, the portal reads the live state from the management controller; the badge shows checking for a moment.
- Choose the control from the table above:
- Shutdown and Reboot act straight away.
- Stop asks you to confirm first, because it discards unsaved data. It also reminds you that stopping a server does not stop billing.
- On a stopped server the row shows Start instead.
- Click Status a few seconds later to see the new state. A reboot takes as long as the machine's own POST and boot, typically one to three minutes on a bare-metal server.


Cloud instances
- Open Virtual Machines in the left-hand menu and click the instance.
- The header shows the live state and, for a running VM, Console, Reboot and Stop. A stopped VM shows Start. The small refresh icon next to the badge re-reads the state from the hypervisor.
- Click the action. A confirmation appears at the top of the page, and the badge follows the machine: a stop can take up to half a minute while the hypervisor waits for the guest, and a reboot passes through Stopped on the way back up.

Every power action is recorded on the Activity page with who did it and when.
Method 2: With the API
You need an API key with the Servers scope (servers.write) for bare metal, or the VMs scope (vms.write) for cloud instances. Create one under Account → API Keys; it is shown once. Full reference: api.amoni.app/v1/docs.
Bare metal
Find the server id in GET /v1/servers, then post the action. The four actions are status, start, shutdown and powercycle.
curl -s -X POST https://api.amoni.app/v1/servers/955/power \
-H "Authorization: Bearer nr_live_..." \
-H "Content-Type: application/json" \
-d '{"action": "powercycle"}'
{ "success": true, "data": { "state": "on", "status": "on" } }
status in the response is normalised to on, off or null (the management controller did not answer); state carries the controller's own wording. Read the state without changing anything:
curl -s -X POST https://api.amoni.app/v1/servers/955/power \
-H "Authorization: Bearer nr_live_..." \
-H "Content-Type: application/json" \
-d '{"action": "status"}'
A powercycle returns as soon as the controller accepted it, not when the machine is back. Poll status if a script needs to wait:
#!/usr/bin/env bash
KEY="nr_live_..."; ID=955
post() { curl -s -X POST "https://api.amoni.app/v1/servers/$ID/power" \
-H "Authorization: Bearer $KEY" -H "Content-Type: application/json" -d "{\"action\": \"$1\"}"; }
post powercycle | jq -r '.data.state'
for i in $(seq 1 30); do
sleep 10
if nc -z -w 3 203.0.113.10 22; then echo "SSH is back"; break; fi
done
Cloud instances
A VM is addressed by its billing account id and its VM id, both in GET /v1/vms:
curl -s https://api.amoni.app/v1/vms -H "Authorization: Bearer nr_live_..." \
| jq '.data.accounts[] | {account_id, vms: [.vms[] | {id, hostname, status}]}'
{ "account_id": 990204, "vms": [ { "id": 411, "hostname": "app1.example.com", "status": "running" } ] }
Then post start, stop or reset. stop is not a graceful shutdown.
curl -s -X POST https://api.amoni.app/v1/vms/990204/411/power \
-H "Authorization: Bearer nr_live_..." \
-H "Content-Type: application/json" \
-d '{"action": "reset"}'
The live state, read from the hypervisor rather than from our cached inventory:
curl -s https://api.amoni.app/v1/vms/990204/411/status \
-H "Authorization: Bearer nr_live_..."
{ "success": true, "data": { "status": "running", "live": true } }
live: false means the hypervisor did not answer and you are seeing our last recorded state.
What the API will tell you
| Status | code |
Meaning |
|---|---|---|
| 200 | none | The controller or hypervisor accepted the action. |
| 401 | invalid_api_key |
The key is wrong, expired or revoked. |
| 403 | insufficient_scope |
The key lacks servers.write or vms.write; required_scope names it. |
| 404 | none | No server or VM with that id on your account. Body: {"success": false, "error": "Not found"}. |
| 422 | none | action is not one of the allowed values: {"message": "The selected action is invalid.", "errors": {"action": ["…"]}}. |
| 429 | none | Rate limit: 120 requests a minute per key. Honour Retry-After. |
| 500 | none / power_failed |
Bare metal: the controller could not be reached (“The action could not be completed right now. Please try again shortly or contact support.”). Cloud: code: power_failed, “Power action failed. Please try again or contact support.” Retry once, then open a ticket. |
About 422s: a rule the endpoint checks itself (a weak password, a duplicate key, a layout you may not use) answers in the usual envelope. A field that fails basic validation currently answers in the framework's own shape, {"message": "…", "errors": {"field": ["…"]}}, without success or code. Branch on the HTTP status for those; the envelope is being extended to cover them.
Troubleshooting
- The badge says Unknown. The management controller did not answer within the time the page allows. Click Status. If it stays unknown, the controller itself may be unreachable; the power actions can still work, and a ticket gets it looked at.
- Shutdown did nothing. The operating system ignored the request, which happens when it is hung. Use Stop or Reboot; both act without the OS.
- It rebooted but does not come back. Open the remote console to see where boot stops. If the disk or boot loader is the problem, rescue mode lets you repair it.
- "Power action failed." The controller refused or could not be reached. Wait a minute and try once more; if it fails again, open a ticket and mention the time of the attempt so we can read the controller's log.
- The cloud VM still shows Running after Stop. The hypervisor waits for the guest to acknowledge; the portal keeps watching for about thirty seconds. Click the refresh icon next to the badge, or read
/statusfrom the API. - Reboot on a bare-metal server is a power cycle. A machine with a large write cache or a database mid-transaction can lose data. When SSH still works,
rebootfrom inside the OS is the safer restart. - Billing continues while a machine is stopped. Stopping is a power state, not a cancellation. To end a service, do that from the Orders or Billing pages.
Still stuck?
Open a support ticket from the portal, pick the server in the “related server” field, and say which control you used and when. The action is in your Activity log and in ours, which makes the diagnosis quick.