---
title: "Read Operations"
method: GET
path: "/api/v1/devices/{device_id}/operations"
tags: ["device operations"]
---

# Read Operations

`GET /api/v1/devices/{device_id}/operations`

## Request

- Base URL: `https://api.brumby.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.brumby.com/api/v1/devices/{device_id}/operations`
- Auth: HTTP bearer

## Path parameters

- `device_id` string, required

## Response `200`

Successful Response

- OperationsSnapshotResponse: Latest device-authored operations snapshot plus server freshness. `stale` is computed at read time; the snapshot itself is retained verbatim — FleetOps never invents replacement values or recomputes the dock's verdict.
  - `device_report` OperationsV1, required: Version 1 operations snapshot published every 5 s, QoS 1, never retained.
    - `schema_version` '1', required
    - `device_id` string, required
    - `boot_id` string, uuid, required
    - `sequence` integer, required
    - `published_at` string, date-time, required
    - `source_mode` 'simulated_jetson' | 'simulated_n100' | 'n100_real_mcu' | 'jetson_real_mcu' | 'commissioned_n100', required
    - `state` DockStateSnapshotV1, required: The supervisor's App A §2 snapshot, transported tolerantly. The dock validates the full snapshot against its vendored state.schema.json before publishing; FleetOps pins only the keys its projection reads and passes the rest through, so supervisor block evolution does not become a fleet-wide ingestion failure.
      - `dock_id` string, required
      - `state` 'BOOT' | 'IDLE_EMPTY' | 'IDLE_STOWED' | 'OPENING' | 'OPEN_READY' | 'LAUNCHING' | 'RECEIVING' | 'CLOSING' | 'CHARGING' | 'FAULT' | 'LOCKOUT', required
      - `ts` string, date-time, required
      - `faults` object[]
    - `preflight` PreflightResultV1, required: The dock's canonical preflight verdict, forwarded verbatim. FleetOps never recomputes this: `pass` is pinned to the checks by the dock and re-validated here so a disagreeing payload is rejected rather than reinterpreted.
      - `schema` integer, required
      - `dock_id` string, required
      - `ts` string, date-time, required
      - `pass` boolean, required
      - `profile` 'launch' | 'launch_request' | 'arrival' | 'maintenance', required
      - `intent_id` string, nullable
      - `checks` PreflightCheckV1[], required
    - `diagnostic` DiagnosticProcessesV1, required
      - `hello_world` HelloWorldStateV1, required: State of the fixed diagnostic child process.
        - `status` 'running' | 'stopped', required
        - `pid` integer, nullable
        - `exit_code` integer, nullable
        - `started_at` string, date-time, nullable
        - `last_transition_at` string, date-time, nullable
        - `last_action_id` string, uuid, nullable
    - `recall` RecallV1: A standing recall: an operator has asked the aircraft to stop flying. HELD AS STATE, NOT DELIVERED AS AN EVENT. The dock re-sends the abort every second for as long as this stands, so an aircraft that was out of range when the operator asked still receives it on return. It clears when the aircraft is back on the pads or when an operator withdraws it — which means its presence here is the answer to "is a recall currently being transmitted", the one thing an operator watching a recall they just placed actually needs to see. ``action`` mirrors the supervisor's ``RECALL_VERBS`` rather than importing them: the values are wire vocabulary, and pinning them here is what makes an unknown verb a validation failure instead of a silently forwarded string.
      - `action` 'rth' | 'recover' | 'cancel_launch', required
      - `reason` string, required
      - `since` string, date-time, required
    - `simulation_runtime` SimulationRuntime
      - `schema_version` '1', required
      - `profile_id` 'sitl-bench-stub-v1', required
      - `role` 'air' | 'dock', required
      - `observed_at` string, date-time, required
      - `ready` boolean, required
      - `reasons` string[]
      - `dock_id` string, nullable
      - `companion_id` string, nullable
      - `binding_generation` integer, nullable
      - `boot_id` string, nullable
      - `runtime_id` string, nullable
    - `external_session` object, nullable
  - `received_at` string, date-time, required
  - `stale` boolean, required
  - `stale_after_seconds` integer, required

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/brumby/apis/brumby-platform-api.md) - [All operations](https://skmtc.dev/brumby/apis/brumby-platform-api/llms.txt) - [OpenAPI document](https://skmtc.dev/brumby/apis/brumby-platform-api/revisions/fe185e20813e?raw)
