A bare-metal server shows the traffic on its switch port: what it is doing right now, what it averaged and peaked at, its 95th percentile, and the total moved in and out over the period. A cloud instance shows what the hypervisor sees instead: CPU, memory, network and disk activity over time. Both are in the portal and in the API; what follows is where to look and how to read the numbers.
Two conventions to keep straight:
- Rates are in bits per second (Mbps, Gbps). A 10 Gbps port moves at most 10 gigabits, which is 1.25 gigabytes, per second.
- Totals are in bytes (GB, TB). This is the unit your plan is written in. Only outbound transfer counts on a metered plan; inbound is free. See bandwidth explained for how metered and unmetered plans work.
Method 1: In the portal
Bare-metal servers: the Graphs tab
- Log in at amoni.app, open Servers, click the server, then the Graphs tab.
- If the server has more than one connected port, pick it from the buttons at the top right. The line under the heading names the port, its type, link speed and whether it is up.
- The three tiles are live: Link speed, Inbound and Outbound as of the last poll.
- The table gives, for the selected period and each direction: Now, Avg, Max, 95th % (all rates), and Total (bytes moved). The note beneath says since when statistics exist for this port; a young collection covers less than the period you picked.
- The graph draws the same period. Switch between Day, Week, Month and Year at the bottom; the table follows.

Reading the 95th percentile. Take every five-minute sample in the period, sort them, and discard the top 5%. The highest remaining sample is the 95th percentile: a picture of sustained load that ignores short bursts. It is the figure to compare against a port speed when you wonder whether to upgrade; a 95th percentile near the link speed means the port is saturated for real, not just spiking.
Cloud instances: the Insights tab
- Open Virtual Machines, click the instance, then Insights.
- Pick a window: Hour, Day, Week, Month or Year.
- Four charts share the same clock: CPU (percent of the allocated cores), Memory (used, against the allocation in the title), Network (in and out, bits per second) and Disk I/O (read and write, bytes per second).

These are hypervisor metrics, so they need nothing installed in the guest, and they are what we would look at if you opened a ticket about performance. A gap in a line is time the instance was powered off. A flat line at zero is an instance that was on and doing nothing.
Method 2: With the API
All of this is readable with the read scope. Reference: api.amoni.app/v1/docs.
Bare metal
1. Find the port. Each connected interface carries a port_id; that is what the other two calls take.
curl -s https://api.amoni.app/v1/servers/955/bandwidth -H "Authorization: Bearer nr_live_..."
{ "success": true, "data": [ {
"id": 1, "interface_name": "eth0", "type": "ethernet", "speed": 10000, "status": "up",
"port_name": "Ethernet12", "port_id": 5011, "in_bps": 412300000, "out_bps": 168000000 } ] }
2. Period statistics for that port. period is day (default), week, month or year.
curl -s "https://api.amoni.app/v1/servers/955/bandwidth/stats?interface=5011&period=month" \
-H "Authorization: Bearer nr_live_..."
{
"success": true,
"data": {
"period": "month",
"samples": 8640,
"covered_from": "2026-08-16 00:00:00",
"in_bps": { "now": 412300000, "avg": 361800000, "max": 703200000, "p95": 598400000 },
"out_bps": { "now": 168000000, "avg": 151900000, "max": 302600000, "p95": 259100000 },
"total_in_bytes": 117240000000000,
"total_out_bytes": 49200000000000
}
}
Rates are bits per second; totals are bytes. samples and covered_from tell you how much of the period the numbers really cover. A monthly egress check for a metered plan, in terabytes:
curl -s "https://api.amoni.app/v1/servers/955/bandwidth/stats?interface=5011&period=month" \
-H "Authorization: Bearer nr_live_..." | jq '.data.total_out_bytes / 1e12'
3. The graph itself, as an image you can embed in your own dashboard:
curl -s "https://api.amoni.app/v1/servers/955/bandwidth/graph?interface=5011&period=week" \
-H "Authorization: Bearer nr_live_..." -o web1-week.png
The response is the image (PNG or SVG, per the Content-Type), not JSON.
Cloud instances
The Insights metrics are available in the portal only for now; the public API does not yet expose them (it is on the list). When it does, the call will be:
curl -s "https://api.amoni.app/v1/vms/990204/411/insights?timeframe=day" \
-H "Authorization: Bearer nr_live_..."
{ "success": true, "data": { "timeframe": "day", "points": [
{ "t": 1757900100, "cpu_pct": 23.4, "mem_bytes": 4563402752, "maxmem_bytes": 8589934592,
"net_in_bps": 21300000, "net_out_bps": 61800000, "disk_read_bps": 480000, "disk_write_bps": 1310000 },
{ "t": 1757900400, "cpu_pct": null, "mem_bytes": null, "maxmem_bytes": null,
"net_in_bps": null, "net_out_bps": null, "disk_read_bps": null, "disk_write_bps": null } ] } }
timeframe is hour, day, week, month or year. A point with null values is a moment the instance was off; do not treat it as zero. Results are cached for a minute per instance and window.
What the API will tell you
| Status | Meaning |
|---|---|
| 200 | Data as above; for the graph, an image body. |
| 401 / 403 | Bad key, or a key without read. |
| 404 | No such server on your account, or a port_id that does not belong to this server ({"success": false, "error": "Server not found"}). |
| 422 | Unknown period, or interface missing, in the framework shape: {"message": "The selected period is invalid.", "errors": {"period": ["…"]}}. |
200 with [] |
Interfaces: the server has no port linked to monitoring yet. Open a ticket to have it linked. |
Troubleshooting
- The Graphs tab says no graphable interface, or the graph area is empty. The server's port is not yet linked to our monitoring. Open a ticket with the server; linking it takes minutes and history starts from then.
- The totals look too small for the period. Read the “statistics collected since” note (or
covered_fromin the API). A port linked two days ago cannot show a month. - My invoice says something else. Billing counts outbound bytes on the switch port over the calendar month; the Day, Week and Month periods here are rolling windows ending now. Pick Month at the start of a new month and the two are close, never identical.
- Inbound looks “wrong way round”. Inbound is traffic to your server (downloads, uploads from users). Outbound is what your server sends (page views, downloads served). A web server is outbound-heavy.
- The 95th percentile is higher than the average by a lot. Normal for bursty traffic. It is the average that tells you total use, the 95th that tells you how busy the port gets.
- Insights shows gaps. The instance was off for those minutes. Gaps in every chart at the same time are a stop or a rebuild; the Activity tab has the timestamps.
Still stuck?
Open a support ticket with the machine selected and the period you are looking at. We read the same graphs, so a screenshot of what you see goes a long way.