Get VPS bandwidth period usage

GET /api/v2/vps/{id}/bandwidth

Return the current bandwidth-allowance period of one VPS: when it started and resets, the allowance counter, and when the traffic actually happened.

Get {id} from GET /api/v2/vps data[].id.

allowance carries the same fields as bandwidth on GET /api/v2/vps/{id} — the running total for this period.

breakdown.days splits that traffic into Europe/Stockholm calendar days from the period start through today (every day is listed; a day with no traffic is a real zero), and breakdown.peakHour is the busiest 60-minute window.

Values are measured on the VPS's own network interface, so a single large transfer shows up as one spiked day/hour rather than being spread out.

breakdown.source says whether that came from exact counters or was estimated from sampled rates.

When breakdown.available is false, show reason; days is then empty and peakHour null, which means the breakdown was not measured — never that no traffic occurred.

period is null only when the service has no billing anchor at all.

This endpoint works for suspended and over-allowance services too.

VPS Services VM

Authentication

Required API scope: read:vm

Authenticate with an API key in the Authorization: Bearer <token> header.

Context

Path Parameters

id string required Example: vps_01hxa3b4c5d6e7f8g9h0j1k2m3

Public VPS ID. Get it from GET /api/v2/vps data[].id. Do not invent this value; use the exact ID returned by the referenced API response.

Headers

Authorization Bearer <token>
Accept application/json

Responses

200 Bandwidth period usage.
id string required · Example: vps_01hxa3b4c5d6e7f8g9h0j1k2m3

Public VPS ID.

period object · nullable required

The running allowance period. Null when the service has no billing anchor.

allowance object required

Running usage for this period; identical to bandwidth on GET /api/v2/vps/{id}.

allowance.usedGb number required · Example: 123.25
allowance.limitGb number required · Example: 2048
allowance.inboundGb number required · Example: 65.13
allowance.outboundGb number required · Example: 58.12
allowance.usagePercent number required · Example: 6.02
allowance.hasOverage boolean required · Example: false
breakdown object required
breakdown.available boolean required · Example: true

False when the per-day breakdown could not be measured; days is then empty and peakHour null.

breakdown.reason string · nullable required · Example: null

Plain-English explanation when available is false; null otherwise.

breakdown.source string · nullable · enum required · Example: counters

counters = exact cumulative interface counters. estimated = integrated from sampled traffic rates; treat amounts as approximate. Null when unavailable. Same vocabulary as totals.source on GET /api/v2/vps/{id}/metrics.

counters
estimated
breakdown.window object required

Actual measurement coverage inside the period (first and last instant traffic telemetry exists for). Both null when unavailable.

breakdown.window.startAt string · nullable required · Example: 2026-08-27T15:00:00.000Z

Nullable: may be null when not applicable.

breakdown.window.endAt string · nullable required · Example: 2026-08-31T12:00:00.000Z

Nullable: may be null when not applicable.

breakdown.days array<object> required

One entry per Europe/Stockholm calendar day from the period start through today, oldest first.

breakdown.days[].date string required · Example: 2026-08-27
breakdown.days[].inboundGb number required · Example: 65.05
breakdown.days[].outboundGb number required · Example: 57.61
breakdown.hasHourlyResolution boolean required · Example: true

Whether traffic can be attributed to individual hours. False for an estimated breakdown whose samples are coarser than an hour; hours is then empty and peakHour null.

breakdown.hours array<object> required

Every 60-minute window in the period with measured traffic, oldest first. Windows not listed had none. Empty when hasHourlyResolution is false.

breakdown.hours[].startAt string required · Example: 2026-08-27T16:00:00.000Z

Start of the 60-minute window (a whole hour).

breakdown.hours[].inboundGb number required · Example: 65
breakdown.hours[].outboundGb number required · Example: 57.6
breakdown.peakHour object · nullable required

The 60-minute window with the most traffic in this period. Null when no traffic was measured, or when an estimated breakdown's samples are coarser than an hour (no single hour can be named honestly).

400 Invalid request. The response body is an RFC 7807 Problem Details document.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
401 Unauthorized. Authentication is required.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
403 Forbidden. The caller lacks a required scope or does not own the resource.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
404 Not found. The resource does not exist or is not owned by the caller.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
429 Rate limited. Retry after the limit resets. 429 responses include Retry-After seconds plus X-RateLimit-* headers.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
500 Internal error. Retry later or contact support if the issue persists.
type string · Example: https://developer.hostup.se/errors/invalid_request
title string · Example: Validation failed
status integer · Example: 400
detail string · Example: The request body failed validation.
code string · Example: invalid_request

Stable machine-readable code. Branch on this field, not on detail.

instance string · Example: /api/v2/orders
requestId string · Example: req_01hxa3b4c5d6e7f8g9h0j1k2m3
timestamp string · Example: 2026-04-27T12:34:56.000Z
errors array<object>

Field-level validation errors when code is invalid_request.

errors[].pointer string required · Example: /items/0/eppCode
errors[].detail string required · Example: `eppCode` is required for this transfer.
errors[].code string required · Example: missing_required
extensions object
GET https://cloud.hostup.se/api/v2/vps/{id}/bandwidth
For AI assistants
View as Markdown
cURL
curl -X GET "https://cloud.hostup.se/api/v2/vps/vps_01hxa3b4c5d6e7f8g9h0j1k2m3/bandwidth" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
Response
{
  "id": "vps_01hxa3b4c5d6e7f8g9h0j1k2m3",
  "period": {
    "startAt": "2026-08-25T22:00:00.000Z",
    "endAt": "2026-09-25T22:00:00.000Z",
    "timezone": "Europe/Stockholm"
  },
  "allowance": {
    "usedGb": 123.25,
    "limitGb": 2048,
    "inboundGb": 65.13,
    "outboundGb": 58.12,
    "usagePercent": 6.02,
    "hasOverage": false
  },
  "breakdown": {
    "available": true,
    "reason": null,
    "source": "counters",
    "window": {
      "startAt": "2026-08-27T15:00:00.000Z",
      "endAt": "2026-08-31T12:00:00.000Z"
    },
    "days": [
      {
        "date": "2026-08-26",
        "inboundGb": 0,
        "outboundGb": 0
      },
      {
        "date": "2026-08-27",
        "inboundGb": 65.05,
        "outboundGb": 57.61
      },
      {
        "date": "2026-08-28",
        "inboundGb": 0.2,
        "outboundGb": 0.1
      },
      {
        "date": "2026-08-29",
        "inboundGb": 0.1,
        "outboundGb": 0.05
      },
      {
        "date": "2026-08-30",
        "inboundGb": 0,
        "outboundGb": 0
      },
      {
        "date": "2026-08-31",
        "inboundGb": 0.02,
        "outboundGb": 0.01
      }
    ],
    "hasHourlyResolution": true,
    "hours": [
      {
        "startAt": "2026-08-27T15:00:00.000Z",
        "inboundGb": 0.05,
        "outboundGb": 0.01
      },
      {
        "startAt": "2026-08-27T16:00:00.000Z",
        "inboundGb": 65,
        "outboundGb": 57.6
      },
      {
        "startAt": "2026-08-27T23:00:00.000Z",
        "inboundGb": 0.2,
        "outboundGb": 0.1
      },
      {
        "startAt": "2026-08-29T10:00:00.000Z",
        "inboundGb": 0.1,
        "outboundGb": 0.05
      },
      {
        "startAt": "2026-08-31T09:00:00.000Z",
        "inboundGb": 0.02,
        "outboundGb": 0.01
      }
    ],
    "peakHour": {
      "startAt": "2026-08-27T16:00:00.000Z",
      "inboundGb": 65,
      "outboundGb": 57.6
    }
  }
}