---
title: "Tdx Host Profile Status"
method: POST
path: "/servers/tdx/host_profiles/status"
tags: ["Servers"]
---

# Tdx Host Profile Status

`POST /servers/tdx/host_profiles/status`

Is this host class known, and which VM images cover it? The check `chutes-cvm host verify` runs.

Deliberately version-free: a miner verifies a host BEFORE downloading any image, so this asks
only about the topology -- "can this host run anything at all, and if so what". Whether one
specific image can boot is POST /servers/tdx/preflight, which the launch path runs against the
version it actually holds.

  * `measurements` non-empty -> the class is attestable; those are the images it can launch.
  * empty, `status: pending`  -> registered, awaiting measurement generation. Nothing to do but
    retry later; re-submitting will not speed it up.
  * empty, `status: unknown`  -> never submitted. Register it with
    POST /servers/tdx/host_profiles.

A POST because the API owns the fingerprint: a caller cannot ask about "my topology" without
handing over the profile to be fingerprinted. Stores nothing -- the read-only counterpart to the
submission route. Signed by the miner hotkey, so the signature covers the request body.

## Headers

- `X-Chutes-Hotkey` string, nullable
- `X-Chutes-Signature` string, nullable
- `X-Chutes-Nonce` string, nullable
- `Authorization` string, nullable

## Request body

- HostProfile — One host class, as chutes-cvm's ``HostProfile.to_api_profile()`` submits it. A direct translation of the client's own model: the RTMR0 determinants and nothing else. Stored == hashed == required, one set. An unhashed field stored beside a hashed one would re-split the class at the byte level -- two hosts that measure identically would differ in the stored row, and first-write-wins would silently drop one of them. That is why host RAM, BDFs, DMI strings and the lspci tree are absent rather than merely excluded. Every block forbids extras, so a client that adds a key 422s until the API models it: add the field here, deploy, then roll out the client.
  - `gpus` HostProfileGpuDevice[], required
    - `vendor` string, required
    - `device_id` string, required
    - `pci_class` string, required
    - `numa_node` integer, required
    - `bars` HostProfilePciBar[], required
      - `index` integer, required
      - `size_mb` integer, required
      - `kind` string, required
  - `nvswitches` HostProfileNvswitchDevice[]
    - `vendor` string, required
    - `device_id` string, required
    - `pci_class` string, required
    - `numa_node` integer, required
    - `bars` HostProfilePciBar[], required
      - `index` integer, required
      - `size_mb` integer, required
      - `kind` string, required
  - `ib_devices` HostProfileIbDevice[]
    - `vendor` string, required
    - `device_id` string, required
    - `pci_class` string, required
    - `numa_node` integer, required
    - `bars` HostProfilePciBar[], required
      - `index` integer, required
      - `size_mb` integer, required
      - `kind` string, required
    - `is_bridge_pf` boolean
    - `is_vf` boolean
  - `cpu` HostProfileCpu, required — The host CPU facts that reach RTMR0: the guest -smp and the SMBIOS Type-4 identity. Mirrors chutes-cvm's `HostCpu` field for field. `processor_id` is nullable -- CPUID leaf-1 is unreadable on some hosts -- but the key is required, and generation refuses a null rather than measuring its own host's CPU.
    - `count` integer, required
    - `sockets` integer, required
    - `vendor` string, required
    - `processor_id` string, nullable, required
  - `memory` HostProfileMemory, required — Guest RAM, as the client resolved it. Not host RAM: the sizing rules are per-GPU-profile and live in chutes-cvm, so the client sends the answer. Storing the host total instead would split hosts that measure identically -- 2007 and 2011 GB are one H200 class.
    - `guest_gb` integer, required
  - `numa` HostProfileNuma, required — Host NUMA node count: it picks the guest's memory-map and PXB-PCIe grouping.
    - `node_count` integer, required
  - `qemu` HostProfileQemu, required — The QEMU that builds the guest ACPI measured into RTMR0.
    - `qemu_version` string, required

## Response `200`

Successful Response

- HostProfileStatusResponse — Response for POST /servers/tdx/host_profiles/status: is this host class known, and for which images? The read-only counterpart to the submission response, and the gate `chutes-cvm host verify` runs. Deliberately version-free -- a host is verified before it has downloaded any image, so nothing here depends on what the caller happens to have on disk. Whether one SPECIFIC image can boot is POST /servers/tdx/preflight.
  - `fingerprint` string, required
  - `status` 'accepted' | 'pending' | 'unknown', required — Retention lifecycle of a submitted host class -- monotonic, only ever advances (unknown -> pending -> accepted) and never regresses. ``accepted`` is class-level and version-agnostic: a measurement was generated for this fingerprint at some point, so the class is on the attestable set and retained (its profile is kept for RTMR0 regeneration). It is NOT the answer to "can version X launch here" -- that is POST /servers/tdx/preflight, which joins the caller's (version, rc) to the class's measurements. Submission only reports which of the three the class is in; POST /servers/tdx/host_profiles/status reports the same lifecycle without storing anything.
  - `measurements` HostProfileMeasurement[], required
    - `version` string, required
    - `rc` boolean, required
  - `detail` string, required

## Other responses

- `422` — Validation Error

## Changes

- **2026-09-20** `6543e32b21d3` — 7 breaking, 18 warning, 2 info
  - added the new required request property `cpu/count`
  - added the new required request property `cpu/processor_id`
  - added the new required request property `cpu/vendor`
  - added the new required request property `gpus`
  - …23 more
- **2026-09-15** `fe1de11b2a0e` — 2 info
  - added the new optional request property `gpu/pci_bars`
  - added the new optional request property `gpu/pci_class`
- **2026-09-02** `37e3c562aa28` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/chutes/apis/fastapi/changes/servers/tdx/host_profiles/status/post.md)

---

[API](https://skmtc.dev/chutes/apis/fastapi.md) · [All operations](https://skmtc.dev/chutes/apis/fastapi/llms.txt) · [OpenAPI document](https://skmtc.dev/chutes/apis/fastapi/revisions/6543e32b21d3?raw)
