Skip to content

Usage and costs

View Markdown

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.

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

Terminal window
nodus get job train-llama -o jsonpath='{.status.cost}'
{"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).

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.

Terminal window
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:

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.

Terminal window
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 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.

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.

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.

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.