Assets

Assets are the machines your erasure devices have booted — one row per physical machine per account, each carrying a promoted summary of its hardware plus the complete raw fingerprint behind it. These are the endpoints an integration polls to keep an external system in sync with your inventory.

The asset model

An asset is one row per physical machine per account. The erasure engine reports a hardware fingerprint on every boot, and AVERASE keys the machine by its DMI identity — system UUID plus serial number — so booting the same laptop ten times updates one row rather than creating ten. Each repeat boot refreshes the stored fingerprint and the promoted summary columns, and bumps both updated_at and audited_at.

That upsert behavior is what makes incremental sync work: updated_at moves every time a machine is seen again, so polling with since catches re-audited machines as well as brand-new ones.

Every asset has two layers:

  • The summary — a flat object of promoted fields (manufacturer, model, serial, CPU, memory, storage, battery health, firmware details, and more), returned by the list endpoint. Enough for most integrations.
  • The fingerprint — the complete raw hardware document as reported by the engine, returned only by the detail endpoint.

Summary fields

  • Name
    id
    Type
    string
    Description

    Unique identifier for the asset (asset_…). This is your upsert key — it is stable across boots, so store it and update in place.

  • Name
    account_id
    Type
    string
    Description

    The owning account, in prefixed form (acct_…).

  • Name
    record_id
    Type
    string
    Description

    The identifier of the most recent boot report from this machine (e.g. CW-20260727-001519). Changes on every boot.

  • Name
    manufacturer
    Type
    string
    Description

    System manufacturer from the DMI tables (e.g. Dell Inc.).

  • Name
    model
    Type
    string
    Description

    System product name (e.g. Latitude 5540).

  • Name
    serial_number
    Type
    string
    Description

    The machine's serial number.

  • Name
    asset_tag
    Type
    string
    Description

    The machine's asset tag, when the firmware carries one.

  • Name
    cpu_model
    Type
    string
    Description

    Full CPU model string.

  • Name
    memory_total_bytes
    Type
    integer
    Description

    Total installed memory, in bytes.

  • Name
    storage_summary
    Type
    string
    Description

    Human-readable summary of the machine's internal drives.

  • Name
    storage_serials
    Type
    string
    Description

    Serial numbers of the machine's internal drives — useful for matching wipe results back to their source machine.

  • Name
    battery_health_pct
    Type
    integer
    Description

    Battery health percentage. On machines with more than one battery, this is the minimum across them.

  • Name
    tpm_version
    Type
    string
    Description

    TPM version (e.g. 2.0).

  • Name
    firmware_mode
    Type
    string
    Description

    Firmware mode, e.g. UEFI.

  • Name
    secure_boot
    Type
    boolean
    Description

    Whether Secure Boot was enabled at the time of the last boot.

  • Name
    bios_version
    Type
    string
    Description

    BIOS/firmware version string.

  • Name
    engine_version
    Type
    string
    Description

    Version of the erasure engine that produced the most recent report.

  • Name
    technician
    Type
    string
    Description

    Name of the user who first reported the machine — the technician whose device token booted it first.

  • Name
    notes
    Type
    string
    Description

    Operator notes attached from the kiosk.

  • Name
    test_results
    Type
    object
    Description

    Hardware test outcomes, keyed by test id (keyboard, display, usb_ports, battery, wifi_adapter, bluetooth, webcam, audio, touchscreen), each with a status (passed, failed, not_started, not_applicable, detected) and optional detail. Empty ({}) when no tests have been run.

  • Name
    first_seen_at
    Type
    timestamp
    Description

    When this machine was first reported to the account.

  • Name
    audited_at
    Type
    timestamp
    Description

    When the machine last booted an erasure device — the timestamp of its most recent hardware audit.

  • Name
    updated_at
    Type
    timestamp
    Description

    When the row last changed. This is the field the since parameter filters on.


GET/api/v1/assets

List assets

Returns the account's assets as summary objects, paginated, newest first — ordered by updated_at descending, so the most recently seen machines lead the list.

Optional query parameters

  • Name
    account_id
    Type
    string
    Description

    Cross-check against the token's account. Both the numeric account id and the prefixed acct_… form are accepted. Sending any other account's id returns 404 — the scope is never silently widened to the token's own account.

  • Name
    since
    Type
    timestamp
    Description

    ISO-8601 timestamp; returns only assets with updated_at at or after it. This is the incremental-sync cursor. A malformed value returns 422.

  • Name
    serial
    Type
    string
    Description

    Exact-match filter on serial_number — look up one machine by its serial.

  • Name
    page
    Type
    integer
    Description

    Page number. Walk pages until page equals pages in the response.

Response envelope

  • Name
    assets
    Type
    array
    Description

    The page of asset summary objects.

  • Name
    page
    Type
    integer
    Description

    The current page number.

  • Name
    pages
    Type
    integer
    Description

    Total number of pages for this query.

  • Name
    count
    Type
    integer
    Description

    Total number of matching assets across all pages.

Errors

StatusBodyMeaning
401(empty)Missing or invalid token
404{"error": "Asset not found"}account_id names an account outside the token's scope
422see rightMalformed since value

Request

GET
/api/v1/assets
curl -G https://averase.com/api/v1/assets \
  -H "Authorization: Bearer $TOKEN" \
  -d account_id=acct_bzXq9KrLEMm32iAnOP0xGDYk \
  -d since=2026-07-26T00:00:00Z \
  -d page=1

Response

{
  "assets": [
    {
      "id": "asset_Mlrnd05DOeK6qILJp1gE9bN3",
      "account_id": "acct_bzXq9KrLEMm32iAnOP0xGDYk",
      "record_id": "CW-20260727-001519",
      "manufacturer": "Dell Inc.",
      "model": "Latitude 5540",
      "serial_number": "74HRKY3",
      "asset_tag": null,
      "cpu_model": "13th Gen Intel(R) Core(TM) i5-1335U",
      "memory_total_bytes": 17179869184,
      "storage_summary": "PM9B1 NVMe Samsung 512GB 512 GB",
      "storage_serials": "S6MZNF1WA04527",
      "battery_health_pct": 75,
      "tpm_version": "2.0",
      "firmware_mode": "UEFI",
      "secure_boot": false,
      "bios_version": "1.21.0",
      "engine_version": "1.0.0",
      "technician": "Jane Smith",
      "notes": null,
      "test_results": {},
      "first_seen_at": "2026-07-27T00:15:39.574Z",
      "audited_at": "2026-07-27T00:15:39.574Z",
      "updated_at": "2026-07-27T00:15:39.583Z"
    }
  ],
  "page": 1,
  "pages": 1,
  "count": 42
}

422 (malformed since)

{
  "error": "invalid `since` — use ISO-8601, e.g. 2026-07-26T00:00:00Z"
}

GET/api/v1/assets/:id

Retrieve an asset

Returns a single asset: the same summary object as the list endpoint, plus fingerprint — the complete raw hardware document exactly as the engine reported it on the machine's most recent boot.

The fingerprint's sections (present when the hardware has them):

  • system — DMI identity: manufacturer, product, serial, UUID
  • cpu
  • memory
  • storage — per-drive detail including SMART data: power-on hours, wear, reallocated sectors, temperature
  • storage_controllers
  • gpus
  • network
  • wifi_adapters
  • audio_devices
  • batteries
  • displays — EDID data, including the panel serial
  • usb
  • usb_version
  • ports
  • hdmi
  • bluetooth
  • raid_controllers
  • thermals
  • fans
  • power_adapters
  • touchscreen
  • world_facing_camera

Newer engine versions add sections over time (storage_controllers, ports, usb_version, and hdmi are recent additions), so treat the set as open-ended and every section as optional.

Errors

StatusBodyMeaning
401(empty)Missing or invalid token
404{"error": "Asset not found"}Unknown id, or an asset belonging to another account — the two are indistinguishable by design

Request

GET
/api/v1/assets/asset_Mlrnd05DOeK6qILJp1gE9bN3
curl https://averase.com/api/v1/assets/asset_Mlrnd05DOeK6qILJp1gE9bN3 \
  -H "Authorization: Bearer $TOKEN"

Response (abridged)

{
  "id": "asset_Mlrnd05DOeK6qILJp1gE9bN3",
  "account_id": "acct_bzXq9KrLEMm32iAnOP0xGDYk",
  "record_id": "CW-20260727-001519",
  "manufacturer": "Dell Inc.",
  "model": "Latitude 5540",
  "serial_number": "74HRKY3",
  "updated_at": "2026-07-27T00:15:39.583Z",
  "fingerprint": {
    "system": {
      "manufacturer": "Dell Inc.",
      "product": "Latitude 5540",
      "serial": "74HRKY3",
      "uuid": "4c4c4544-0034-4810-8052-b4c04f4b5933"
    },
    "cpu": { "...": "..." },
    "memory": { "...": "..." },
    "storage": { "...": "..." },
    "batteries": { "...": "..." },
    "displays": { "...": "..." }
  }
}

Not found

{ "error": "Asset not found" }

Incremental sync

The pattern the API is designed around:

Sync loop

cursor = timestamp of your last successful run's START

every run:
  run_started_at = now
  page = 1
  loop:
    GET /api/v1/assets?account_id={account_id}&since={cursor}&page={page}
    upsert each asset into your system by its "id"
    (optionally GET /api/v1/assets/{id} for the full fingerprint)
    stop when page == pages
    page += 1
  persist cursor = run_started_at

Three details make it robust:

  • Upsert by id. The id is stable across boots, so a machine that boots again arrives as an update to the row you already have, not a duplicate.
  • Advance the cursor to the run's start, not its end. An asset updated while your run was in flight lands after your since on the next run instead of falling into the gap. Re-fetching a few rows is free; missing one is not.
  • Remember the ordering. Results come newest-first by updated_at, so page 1 of an un-filtered query is also a quick "what changed lately" view.

Any polling frequency is fine — the API is read-only, and since keeps each run proportional to what actually changed.

Was this page helpful?