# Usage and costs

> See what each run cost, split by project, label, meter and segment, and export usage as CSV.

Source: https://nodus-platform-site.pages.dev/docs/guides/billing/usage-and-costs/
Build revision: 211ad9f836655b1c3a2668c4693e442471f28614

Every charge Nodus makes is backed by usage records: one line per meter, per object, per window. This page shows how to read them, group them and export them.

## See what a run cost

Each compute object shows its cost so far in `status.cost`:

Terminal window

```bash
nodus get job train-llama -o jsonpath='{.status.cost}'
```

```json
{"totalUSD": "4.182500", "heldUSD": "0.750000", "bySegment": {"bootUSD": "0.121000", "runningUSD": "3.980000", "teardownUSD": "0.081500"}}
```

`heldUSD` is reserved but not yet charged. The total becomes final once the capacity behind the run is confirmed deleted, which can be a minute or two after the run itself ends.

When a run fails because of Nodus, the teardown after the failure and any of its start not yet billed are not charged: `bySegment.coveredByNodus` names those segments, and `nodus describe` shows them on the cost line, for example `$0.00 (covered by Nodus: boot, teardown)`.

## What each segment covers

Compute usage from the moment the capacity starts billing until it is confirmed deleted is split into segments:

|Segment|Covers|
|-|-|
|`Boot`|From the start of billing to the moment your command starts: boot, registration, readiness checks and pulling your image|
|`Running`|Your command running, including reading inputs, lazy image fetches, checkpoint writes and the snapshot when the run stops|
|`Restore`|For a run that resumes from a checkpoint or snapshot: from the start of billing to the moment your command starts again, including the restore. It replaces `Boot`|
|`Teardown`|From the stop to confirmed deletion, plus the capacity’s billing increment (lines with `detail: IncrementRounding`)|

Time between runs that reuse the same capacity is billed on the `warm_idle_seconds` meter and has no segment. When Nodus itself delays a deletion, that time is not charged: it shows as a zero-amount line with `detail: NodusBorne`.

## List and group usage

Terminal window

```bash
nodus get usage --since 2d
nodus get usage --group-by project,meter
nodus get usage --group-by member --since 30d
nodus get usage --group-by label:team,day
nodus get usage --group-by rank,segment --field-selector object.uid=<uid of a multi-node Job>
```

`--group-by` accepts `project`, `kind`, `member`, `meter`, `day`, `segment`, `rank` and `label:<key>`. `member` is the person who started the work, whichever of their API keys they used. Labels are the ones the object carried when it was admitted, so label your work before you submit it:

```yaml
metadata:
  name: train-llama
  labels:
    team: research
```

Grouped totals always add up to the ungrouped total: every line lands in exactly one group, and lines without the grouped value share an empty group.

## Export as CSV

Terminal window

```bash
nodus get usage --since 30d -o csv > usage.csv
curl -H "Authorization: Bearer $NODUS_TOKEN" -H "Accept: text/csv" \
  "https://api.nodus-compute.ai/v1/usagerecords?since=30d"
```

Amounts are in US dollars with six decimals. `quantity` is in the meter’s unit (seconds, tokens, GiB or characters), and `rate_micros` is the rate in micro-dollars per `rate_basis` units.

## Inference and Indra

Inference requests are rolled up into one line per model, meter and hour. A request to `nodus/indra` (Indra) shows the model that served it and, beside it, the routing call’s input and output tokens on lines whose SKU ends in `:routing:input` and `:routing:output`. The request is charged once, rounded up to the micro-dollar over all of its lines together.

## Agents

An Agent’s idle workers bill as warm idle on the Agent. When a run claims a worker, the worker’s time from that moment bills on the AgentRun until the run releases it, so each second of worker time appears once. Model calls a run makes with Nodus’s Claude are billed per request on the AgentRun, with the routing call beside the model that answered; calls made with your own Anthropic key carry no Nodus model charge.

## Storage and egress

Retained storage (checkpoints, Volumes, images you build, and Job and Agent outputs) is sampled every hour per object. The first 10 GB across your organization are included and shared across your objects in proportion to their size; each object’s line shows only its billable part. The hours of a UTC day are charged together shortly after midnight UTC, as one `Storage` transaction.

Egress from your containers and interactive sessions is counted per object per UTC day. The first 10 GiB a day across your organization are included, and the rest is charged the next morning as one `Egress` transaction, split across objects by bytes.

If your balance cannot cover a daily storage or egress charge, the remainder becomes arrears. While arrears are outstanding, new runs and uploads are refused with `ArrearsOutstanding`; your next top-up pays them first.

Storage left in arrears gets an email at 7, 21 and 28 days. At 30 days Nodus proposes deleting the stored data beyond the included 10 GB: finished Jobs’ checkpoints and outputs first, then older Volume revisions, then the latest revisions, oldest first. Nothing is deleted until two Nodus administrators approve the list, and paying your arrears before then cancels it. Deleting data does not clear the arrears.

## Meters reference

`quantity` is in the meter’s unit. `rate` applies to `rateBasis` units of quantity, so a line’s amount is `quantity × rate ÷ rateBasis`, rounded down, except that the last line of a run rounds up to the capacity’s billing increment.

|Meter|Billed for|Unit|Rate is per|`rateBasis`|SKU|
|-|-|-|-|-|-|
|`compute_seconds`|Dedicated capacity for Jobs, GPU Sandboxes, GPU Workspaces, Functions and training members, with a segment|seconds|hour|3 600|`rented:<offering>`|
|`warm_idle_seconds`|Warm capacity kept between runs, idle Function and agent workers|seconds|hour|3 600|`rented:<offering>`|
|`node_vcpu_seconds`|vCPU on shared nodes (Sandboxes, agent runs), with a segment|milli-vCPU seconds|vCPU-hour|3 600 000|`node:vcpu`|
|`node_gib_seconds`|Memory on shared nodes, with a segment|MiB seconds|GiB-hour|3 686 400|`node:memory`|
|`node_disk_gib_seconds`|Requested disk above 10 GiB per vCPU on shared nodes|GiB seconds|GiB-hour|3 600|`node:disk`|
|`build_vcpu_seconds`|Image builds, with a segment|milli-vCPU seconds|vCPU-hour|3 600 000|`build:vcpu`|
|`storage_gb_hours`|Retained storage above 10 GB per organization|MB hours|GB-month (30 days)|720 000|`storage:retained`|
|`egress_gib`|Egress above 10 GiB per organization per UTC day; relayed training traffic from the first byte|MiB|GiB|1 024|`egress:gib`, `egress:mesh-relay`, `egress:supplier`|
|`inference_input_tokens`|Input tokens|tokens|million tokens|1 000 000|`model:<model>:input`|
|`inference_output_tokens`|Output tokens, reasoning included|tokens|million tokens|1 000 000|`model:<model>:output`|
|`inference_cache_read_tokens`|Cached input read|tokens|million tokens|1 000 000|`model:<model>:cache_read`|
|`inference_cache_write_tokens`|Cache writes, 5-minute or 1-hour|tokens|million tokens|1 000 000|`model:<model>:cache_write_5m`, `model:<model>:cache_write_1h`|
|`inference_audio_seconds`|Transcription and translation, 10 s minimum per request|milliseconds|audio-hour|3 600 000|`model:<model>:audio`|
|`inference_speech_characters`|Speech synthesis input|characters|million characters|1 000 000|`model:<model>:speech`|
|`platform_device_hours`|Your own devices assigned to Nodus-scheduled work|device seconds|device-hour|3 600|`platform:device-hour`|
|`platform_predict_seconds`|Predict on one of your pools|seconds|30-day month|2 592 000|`platform:predict`|

Indra requests add a routing line beside the model’s lines, with SKU `<router>:routing:input` or `<router>:routing:output`. An `egress:supplier` line passes through an egress charge billed for your dedicated capacity at the same margin as the capacity itself.
