---
title: "Machine detail: compatibility findings, current offer/job, observed metrics, drain state (host owner/admin)"
method: GET
path: "/api/v1/hosts/machines/{id}"
tags: ["hosts"]
---

# Machine detail: compatibility findings, current offer/job, observed metrics, drain state (host owner/admin)

`GET /api/v1/hosts/machines/{id}`

## Request

- Base URL: `https://amplerun-api.spiry.org`
- URL: `https://amplerun-api.spiry.org/api/v1/hosts/machines/{id}`
- Auth: HTTP bearer

Includes `telemetry`: the latest agent-reported sample plus `observed_at`, `age_s` and `boot_id`, or null when nothing was ever reported. Telemetry is evidence only and never influences admission, qualification, billing or job state. A measurement the host could not take is ABSENT from the object — it is never rendered as 0 and never carried over from an earlier sample, so a consumer must age it via `age_s` and show `unknown` when stale.

## Path parameters

- `id` string, uuid, required

## Response `200`

Machine detail.

- object
  - `accepts_custom_images` boolean: The host's opt-in to renter-supplied public images on this machine (default false).
  - `tier` 'container' | 'inference': Tier A (renter containers) or Tier B (managed inference), set at enrollment.
  - `host_mode` object, nullable: D-22 host mode as the last heartbeat reported it; null until one does.
    - `mode` 'dedicated' | 'idle' | 'colisted', nullable
    - `offerable` boolean, nullable
    - `reasons` string[]
    - `observed_at` string
  - `kernel_driver_runtime` string, nullable: Kernel/driver/runtime triple from the manifest, e.g. linux-6.8/nvidia-560.35/cuda-12.6.
  - `recent_jobs` object[]: The machine's latest 20 rentals, newest first. ended_at is null while a rental is open.
    - `job_id` string, uuid, required
    - `state` string, required
    - `started_at` string, date-time, required
    - `ended_at` string, date-time, required
    - `rate_micro_per_hour` string, required
    - `ready` boolean: False when the host never reached READY (a refused START): nothing ran and nothing was billed.
    - `billed_ms` string: Metered (billed) runtime in ms, from READY.
    - `earned_micro` string: The host's posted share for this rental, micro-USD.
  - `listing_blockers` string[]
  - `market_price` object, nullable: D-35 suggested listing price: the market price a renter pays for ONE of this GPU for one hour. basis amplerun = AmpleRun's own listed offers of this model (at least 3); otherwise basis reference = a hand-curated table of official public list prices, each with its page and the date it was read (upper side, p75); otherwise basis throughput = each reference row of the same class (consumer or datacenter) turned into the price giving this GPU the same tokens per dollar, from memory bandwidth (LLM token generation is memory-bound), and the p75 of those. Renters pay the listed price (the 10% commission comes out of it), so the suggestion is the market price itself. null when neither exists. A suggestion only: the host sets its own price.
    - `gpu_model` string, required: Canonical GPU name the prices were matched to.
    - `basis` 'amplerun' | 'reference' | 'throughput', required
    - `median_micro_per_gpu_hour` string, required: Decimal string, micro-USD per GPU per hour.
    - `sample_size` integer, required: Listings or reference prices behind the median.
    - `sources` object[], required
      - `label` string, required
      - `url` string, required: Page where the price can be checked.
      - `accessed` string, required: YYYY-MM-DD the price was read.
    - `estimate` object, nullable: ESTIMATED from memory bandwidth, not measured on this machine. null when the GPU's bandwidth is unknown.
      - `tok_s_8b` number, required: Estimated generation speed on an 8B Q4_K_M model, tokens/s.
      - `micro_per_million_tokens` string, required: The per-GPU-hour price per 1M generated tokens at that speed, micro-USD.
      - `fits_up_to_b_params` integer, required: Largest model that fits, billions of parameters at Q4.
  - `auto_qualify` object: The automatic machine test: the worker queues it while the agent heartbeats, retries failures with backoff, and admits a passed machine with a listed offer. reason is set for retrying and needs_attention.
    - `state` 'testing' | 'passed' | 'retrying' | 'needs_attention' | 'waiting', required
    - `reason` string, nullable, required
  - `telemetry` object, nullable: Task A machine telemetry sample, mirroring telemetry.schema.json (the cross-language authority). EVERY measurement is optional: a probe that failed or was absent omits its field entirely. An absent field means "not measured", never 0 and never the previous reading. Byte/second counters are decimal strings; percentages and temperatures are bounded numbers.
    - `devices` object[], required
      - `pci_address` string, required
      - `temperature_c` number
      - `utilization_pct` number
      - `memory_used_bytes` string: Unsigned base-10 integer as string; never a float.
      - `power_watts` number
      - `fan_pct` number
      - `vendor` 'nvidia' | 'amd' | 'intel' | 'apple'
      - `uuid` string: Normalised device UUID (GPU-/MIG- prefix stripped, lowercase).
      - `memory_total_bytes` string: Unsigned base-10 integer as string; never a float.
      - `unified_memory_used_bytes` string: Unsigned base-10 integer as string; never a float.
      - `health` object: Absent = this vendor gives no health signal. ok=false carries the reason.
        - `ok` boolean, required
        - `reason` string
      - `source` 'lib' | 'cli' | 'sysfs'
    - `host` object
      - `cpu_utilization_pct` number
      - `memory_used_bytes` string: Unsigned base-10 integer as string; never a float.
      - `disk_free_bytes` string: Unsigned base-10 integer as string; never a float.
      - `uptime_s` string: Unsigned base-10 integer as string; never a float.
      - `load1` number
    - `observed_at` string, date-time, required
    - `age_s` integer, required
    - `boot_id` string, required

## Other responses

- `default`: Error envelope. 401 unauthenticated, 403/404 forbidden, 409 conflict, 422 invalid input, 429 rate limited (code UNAVAILABLE, retryable:true, no Retry-After header), 503 unavailable money/provider state with retryable:true.

---

[API](https://skmtc.dev/amplerun/apis/amplerun-business-api.md) · [All operations](https://skmtc.dev/amplerun/apis/amplerun-business-api/llms.txt) · [OpenAPI document](https://skmtc.dev/amplerun/apis/amplerun-business-api/revisions/40944687fa52?raw)
