{
  "components": {
    "schemas": {
      "ActivityList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ActivityOut"
            },
            "title": "Items",
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "title": "ActivityList",
        "type": "object"
      },
      "ActivityOut": {
        "additionalProperties": false,
        "properties": {
          "actor": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Person"
              },
              {
                "type": "null"
              }
            ]
          },
          "actor_organization": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Ref"
              },
              {
                "type": "null"
              }
            ]
          },
          "at": {
            "format": "date-time",
            "title": "At",
            "type": "string"
          },
          "detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Detail"
          },
          "kind": {
            "title": "Kind",
            "type": "string"
          },
          "new_value": {
            "anyOf": [
              {},
              {
                "type": "null"
              }
            ],
            "title": "New Value"
          },
          "old_value": {
            "anyOf": [
              {},
              {
                "type": "null"
              }
            ],
            "title": "Old Value"
          }
        },
        "required": [
          "at",
          "kind"
        ],
        "title": "ActivityOut",
        "type": "object"
      },
      "AnnouncementFeed": {
        "additionalProperties": false,
        "description": "What a reader sees, split the way it is rendered.\n\nReleases are permanent history: \"what changed\", listed newest first and\nnever expiring. Notices are shown only while they are active. They are two\ndifferent things in the interface, so they are two lists here rather than\none list the client has to partition and time-filter itself.",
        "properties": {
          "notices": {
            "items": {
              "$ref": "#/components/schemas/AnnouncementOut"
            },
            "title": "Notices",
            "type": "array"
          },
          "releases": {
            "items": {
              "$ref": "#/components/schemas/AnnouncementOut"
            },
            "title": "Releases",
            "type": "array"
          },
          "unseen_release_count": {
            "title": "Unseen Release Count",
            "type": "integer"
          }
        },
        "required": [
          "releases",
          "notices",
          "unseen_release_count"
        ],
        "title": "AnnouncementFeed",
        "type": "object"
      },
      "AnnouncementOut": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "title": "Body",
            "type": "string"
          },
          "created_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ends At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "published": {
            "title": "Published",
            "type": "boolean"
          },
          "published_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Published At"
          },
          "seen": {
            "title": "Seen",
            "type": "boolean"
          },
          "severity": {
            "title": "Severity",
            "type": "string"
          },
          "starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Starts At"
          },
          "title": {
            "title": "Title",
            "type": "string"
          },
          "updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Updated At"
          },
          "version": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Version"
          }
        },
        "required": [
          "id",
          "title",
          "body",
          "severity",
          "published",
          "seen"
        ],
        "title": "AnnouncementOut",
        "type": "object"
      },
      "ApprovalStatus": {
        "enum": [
          "approved",
          "pending",
          "rejected"
        ],
        "title": "ApprovalStatus",
        "type": "string"
      },
      "BookOutcome": {
        "description": "Per-pass result of `POST /passes/book`.\n\nSwitch on this, not on the HTTP status. The batch is always `207` and\neach id carries its own outcome.\n\nReserved: `booked` (the station acknowledged) and `pending_sync` (reserved\nhere, not on the modem yet, because the station was unreachable; the\nreconnect reconciler pushes it). Both hold the slot.\n\nNot reserved: `station_refused` (the station was reachable and declined),\n`already_booked`, `conflict` (another reservation or its turnaround covers\nthe window), `not_found`, `permission_denied`, `in_the_past`,\n`window_required` (a continuously visible satellite needs an explicit\n`session`), `window_not_allowed` (this pass has a predicted window and the\nrequest supplied one anyway), and `error`.",
        "enum": [
          "booked",
          "pending_sync",
          "station_refused",
          "already_booked",
          "conflict",
          "not_found",
          "permission_denied",
          "window_required",
          "window_not_allowed",
          "in_the_past",
          "error"
        ],
        "title": "BookOutcome",
        "type": "string"
      },
      "BookReport": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/BookResult"
            },
            "title": "Items",
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "title": "BookReport",
        "type": "object"
      },
      "BookRequest": {
        "additionalProperties": false,
        "example": {
          "mission_config": {
            "rxdsp": {
              "frequency_hz": 2245000000
            },
            "telemetry": {
              "fec": "RS_255_223"
            }
          },
          "pass_ids": [
            "0f4f2b8c-1d2e-4a3b-9c8d-7e6f5a4b3c2d"
          ]
        },
        "properties": {
          "mission_config": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mission Config"
          },
          "pass_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 1,
            "title": "Pass Ids",
            "type": "array"
          },
          "recorder_enabled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Recorder Enabled"
          },
          "session": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SessionWindow"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "pass_ids"
        ],
        "title": "BookRequest",
        "type": "object"
      },
      "BookResult": {
        "additionalProperties": false,
        "properties": {
          "booking_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Booking Id"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ends At"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message"
          },
          "pass_id": {
            "format": "uuid",
            "title": "Pass Id",
            "type": "string"
          },
          "result": {
            "$ref": "#/components/schemas/BookOutcome"
          },
          "starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Starts At"
          }
        },
        "required": [
          "pass_id",
          "result"
        ],
        "title": "BookResult",
        "type": "object"
      },
      "Booked": {
        "additionalProperties": false,
        "description": "Held by a booking this caller may be told about.\n\nOrdinarily that means their own organization's; some callers may be told\nabout more.\n\nSeeing one is not holding one. `can_act` says whether this caller may\ncancel it, open its console or edit its mission. Gate your controls on\nthat rather than on who the owner is.\n\nWhether it is the caller's own booking is `booked_by.sub` against their own\nsubject; the server does not repeat that as a flag.",
        "properties": {
          "booked_by": {
            "$ref": "#/components/schemas/Person"
          },
          "booking_id": {
            "format": "uuid",
            "title": "Booking Id",
            "type": "string"
          },
          "booking_status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingStatus"
              },
              {
                "type": "null"
              }
            ]
          },
          "can_act": {
            "default": false,
            "title": "Can Act",
            "type": "boolean"
          },
          "status": {
            "const": "booked",
            "default": "booked",
            "title": "Status",
            "type": "string"
          }
        },
        "required": [
          "booking_id",
          "booked_by"
        ],
        "title": "Booked",
        "type": "object"
      },
      "BookingDetail": {
        "additionalProperties": false,
        "description": "The reservation on a pass, for its owner.",
        "properties": {
          "began_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Began At"
          },
          "booked_at": {
            "format": "date-time",
            "title": "Booked At",
            "type": "string"
          },
          "booked_by": {
            "$ref": "#/components/schemas/Person"
          },
          "elements_epoch": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Elements Epoch"
          },
          "elements_tle1": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Elements Tle1"
          },
          "elements_tle2": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Elements Tle2"
          },
          "ended_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ended At"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ends At"
          },
          "has_files": {
            "default": false,
            "title": "Has Files",
            "type": "boolean"
          },
          "has_recording": {
            "default": false,
            "title": "Has Recording",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "predicted_ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Predicted Ends At"
          },
          "predicted_starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Predicted Starts At"
          },
          "reconciled_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reconciled At"
          },
          "record_by_default": {
            "default": false,
            "title": "Record By Default",
            "type": "boolean"
          },
          "recorder_enabled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Recorder Enabled"
          },
          "starts_at": {
            "format": "date-time",
            "title": "Starts At",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/BookingStatus"
          },
          "window_state": {
            "$ref": "#/components/schemas/BookingWindowState"
          }
        },
        "required": [
          "id",
          "status",
          "starts_at",
          "booked_by",
          "booked_at",
          "window_state"
        ],
        "title": "BookingDetail",
        "type": "object"
      },
      "BookingOut": {
        "additionalProperties": false,
        "description": "One reservation, with everything the board shows about it.\n\nThe artifact flags and the recording state are resolved in grouped queries\nrather than left to the client, because the alternative is a request per\nrow for a view that routinely lists dozens.",
        "properties": {
          "booked_by": {
            "$ref": "#/components/schemas/Person"
          },
          "booked_by_me": {
            "title": "Booked By Me",
            "type": "boolean"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ends At"
          },
          "has_files": {
            "title": "Has Files",
            "type": "boolean"
          },
          "has_recording": {
            "title": "Has Recording",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_continuous": {
            "default": false,
            "title": "Is Continuous",
            "type": "boolean"
          },
          "max_elevation_deg": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Elevation Deg"
          },
          "pass_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pass Id"
          },
          "predicted_ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Predicted Ends At"
          },
          "predicted_starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Predicted Starts At"
          },
          "record_by_default": {
            "title": "Record By Default",
            "type": "boolean"
          },
          "recorder_enabled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Recorder Enabled"
          },
          "satellite": {
            "$ref": "#/components/schemas/app__domains__passes__schemas__SatelliteRef"
          },
          "starts_at": {
            "format": "date-time",
            "title": "Starts At",
            "type": "string"
          },
          "station": {
            "$ref": "#/components/schemas/StationRef"
          },
          "status": {
            "$ref": "#/components/schemas/BookingStatus"
          },
          "window_state": {
            "$ref": "#/components/schemas/BookingWindowState"
          }
        },
        "required": [
          "id",
          "status",
          "starts_at",
          "station",
          "satellite",
          "booked_by",
          "booked_by_me",
          "window_state",
          "has_recording",
          "has_files",
          "record_by_default"
        ],
        "title": "BookingOut",
        "type": "object"
      },
      "BookingPage": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/BookingOut"
            },
            "title": "Items",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "items"
        ],
        "title": "BookingPage",
        "type": "object"
      },
      "BookingStatus": {
        "description": "Where a reservation is in its life.\n\nA cancel cannot skip a state: once a pass is running the station holds real\nstate: it is tracking, the recorder may be going, a mission override is\napplied, and that has to be unwound before the booking is settled.\n`cancel_pending` is that window, and the agent's upload gate asks for it\nalongside `active` so files still landing from a pass being torn down are\nnot orphaned.\n\nMember names are the wire vocabulary: the agent asks for a status by the\nmember name uppercased (see `domains/agent/routes.py`).",
        "enum": [
          "active",
          "cancel_pending",
          "cancelled",
          "aborted",
          "cancelled_locally",
          "refused_at_modem",
          "completed"
        ],
        "title": "BookingStatus",
        "type": "string"
      },
      "BookingWindow": {
        "additionalProperties": false,
        "description": "One busy stretch on one station.\n\nThe identity fields are present only for the caller's OWN bookings. For\nevery other window they are absent from the response rather than null: a\nnull still says \"there is something here I am not being told\".\n\nTo learn who holds a window you may be told about, read the pass or the\nbooking itself.",
        "properties": {
          "booking_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Booking Id"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ends At"
          },
          "enforce_turnaround": {
            "title": "Enforce Turnaround",
            "type": "boolean"
          },
          "mine": {
            "title": "Mine",
            "type": "boolean"
          },
          "organization_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Organization Id"
          },
          "satellite_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Satellite Id"
          },
          "satellite_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Satellite Name"
          },
          "starts_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Starts At"
          },
          "station_id": {
            "format": "uuid",
            "title": "Station Id",
            "type": "string"
          }
        },
        "required": [
          "station_id",
          "enforce_turnaround",
          "mine"
        ],
        "title": "BookingWindow",
        "type": "object"
      },
      "BookingWindowState": {
        "enum": [
          "tracking",
          "drifted",
          "vanished"
        ],
        "title": "BookingWindowState",
        "type": "string"
      },
      "BookingWindows": {
        "additionalProperties": false,
        "properties": {
          "windows": {
            "items": {
              "$ref": "#/components/schemas/BookingWindow"
            },
            "title": "Windows",
            "type": "array"
          }
        },
        "required": [
          "windows"
        ],
        "title": "BookingWindows",
        "type": "object"
      },
      "BundleRequest": {
        "additionalProperties": false,
        "example": {
          "expires_seconds": 3600,
          "file_ids": [
            "9f3a1c72-4d58-4e0b-b6a1-2c8d5e7f0a13"
          ]
        },
        "properties": {
          "expires_seconds": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires Seconds"
          },
          "file_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "File Ids",
            "type": "array"
          }
        },
        "title": "BundleRequest",
        "type": "object"
      },
      "CancelDisposition": {
        "description": "What became of the booking, once the cancel had been handled.\n\nNOT a `BookingStatus`, which is what this field used to be typed as. The\nordinary outcome is that the row is GONE. A reservation handed back\nbefore it flew leaves no record worth keeping, and \"no row\" has no\nbooking status to report. `released` is that case, and typing the field as\n`BookingStatus` made the one common outcome the only impossible one:\npydantic rejected it, the item's savepoint rolled the cancel back, and the\ncaller was told \"Cancel failed; the booking still stands\", which was true\nbecause the refusal is what caused it. Unbooking a pass that had not\nstarted could not succeed at all.",
        "enum": [
          "released",
          "cancel_pending",
          "cancelled",
          "aborted"
        ],
        "title": "CancelDisposition",
        "type": "string"
      },
      "CatalogObjectList": {
        "properties": {
          "limit": {
            "title": "Limit",
            "type": "integer"
          },
          "objects": {
            "items": {
              "$ref": "#/components/schemas/CatalogObjectOut"
            },
            "title": "Objects",
            "type": "array"
          },
          "offset": {
            "title": "Offset",
            "type": "integer"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "total",
          "limit",
          "offset"
        ],
        "title": "CatalogObjectList",
        "type": "object"
      },
      "CatalogObjectOut": {
        "description": "One object as CelesTrak last published it.\n\nNot a satellite in Umoja: no id, no owner, no stations. It is the feed's\nrow, mirrored, and `fetched_at` says when Umoja last heard it.",
        "properties": {
          "epoch": {
            "format": "date-time",
            "title": "Epoch",
            "type": "string"
          },
          "fetched_at": {
            "format": "date-time",
            "title": "Fetched At",
            "type": "string"
          },
          "norad_id": {
            "title": "Norad Id",
            "type": "string"
          },
          "object_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Object Id"
          },
          "object_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Object Name"
          },
          "omm": {
            "additionalProperties": true,
            "title": "Omm",
            "type": "object"
          },
          "tle1": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tle1"
          },
          "tle2": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tle2"
          }
        },
        "required": [
          "norad_id",
          "epoch",
          "fetched_at"
        ],
        "title": "CatalogObjectOut",
        "type": "object"
      },
      "CatalogStatusOut": {
        "description": "Whether the mirror is worth trusting right now.",
        "properties": {
          "enabled": {
            "title": "Enabled",
            "type": "boolean"
          },
          "last_fetched_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Fetched At"
          },
          "next_fetch_in_seconds": {
            "title": "Next Fetch In Seconds",
            "type": "integer"
          },
          "objects": {
            "title": "Objects",
            "type": "integer"
          }
        },
        "required": [
          "objects",
          "next_fetch_in_seconds",
          "enabled"
        ],
        "title": "CatalogStatusOut",
        "type": "object"
      },
      "ChunkMeta": {
        "additionalProperties": false,
        "properties": {
          "chunk": {
            "title": "Chunk",
            "type": "string"
          },
          "size_bytes": {
            "title": "Size Bytes",
            "type": "integer"
          },
          "start_ms": {
            "title": "Start Ms",
            "type": "integer"
          }
        },
        "required": [
          "chunk",
          "size_bytes",
          "start_ms"
        ],
        "title": "ChunkMeta",
        "type": "object"
      },
      "CommandResult": {
        "properties": {
          "data": {
            "anyOf": [
              {},
              {
                "type": "null"
              }
            ],
            "title": "Data"
          },
          "editable_fields": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Editable Fields"
          },
          "ok": {
            "title": "Ok",
            "type": "boolean"
          },
          "station_id": {
            "format": "uuid",
            "title": "Station Id",
            "type": "string"
          }
        },
        "required": [
          "station_id",
          "ok"
        ],
        "title": "CommandResult",
        "type": "object"
      },
      "ConfigEventList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ConfigEventOut"
            },
            "title": "Items",
            "type": "array"
          },
          "seen_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Seen At"
          }
        },
        "required": [
          "items"
        ],
        "title": "ConfigEventList",
        "type": "object"
      },
      "ConfigEventOut": {
        "additionalProperties": false,
        "properties": {
          "actor": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Person"
              },
              {
                "type": "null"
              }
            ]
          },
          "at": {
            "format": "date-time",
            "title": "At",
            "type": "string"
          },
          "booking_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Booking Id"
          },
          "field_key": {
            "title": "Field Key",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "new_value": {
            "anyOf": [
              {},
              {
                "type": "null"
              }
            ],
            "title": "New Value"
          },
          "old_value": {
            "anyOf": [
              {},
              {
                "type": "null"
              }
            ],
            "title": "Old Value"
          },
          "source": {
            "title": "Source",
            "type": "string"
          }
        },
        "required": [
          "id",
          "at",
          "source",
          "field_key"
        ],
        "title": "ConfigEventOut",
        "type": "object"
      },
      "ConflictList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ConflictOut"
            },
            "title": "Items",
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "title": "ConflictList",
        "type": "object"
      },
      "ConflictOut": {
        "additionalProperties": false,
        "description": "One thing standing in the way of this pass.\n\n`kind` is `booking` for a live booking, or `claim` for a pass stopped part\nway through, whose stretch still belongs to its organization until it\nends. `starts_at` is always present, and `ends_at` too unless the\nobstacle is open ended. That is what makes the window unbookable and every\ncaller may see it. The identity fields (`booking_id`, `pass_id`,\n`organization_name`) are present only for the caller's own organization,\nand for platform admins; the same rule `BookingWindow` applies to the\navailability strip.\n\nThey are ABSENT rather than null. A null still says \"there is something\nhere you are not being told\", and the count of nulls is itself a map of\nanother tenant's schedule.",
        "properties": {
          "booking_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Booking Id"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ends At"
          },
          "kind": {
            "enum": [
              "booking",
              "claim"
            ],
            "title": "Kind",
            "type": "string"
          },
          "organization_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Organization Name"
          },
          "pass_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pass Id"
          },
          "starts_at": {
            "format": "date-time",
            "title": "Starts At",
            "type": "string"
          },
          "status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingStatus"
              },
              {
                "type": "null"
              }
            ]
          },
          "vendor_booked": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vendor Booked"
          }
        },
        "required": [
          "kind",
          "starts_at"
        ],
        "title": "ConflictOut",
        "type": "object"
      },
      "CreateSatelliteRequest": {
        "additionalProperties": false,
        "example": {
          "contact_email": "ops@example.org",
          "contact_name": "Mission Operations",
          "description": "S-band technology demonstrator.",
          "name": "AURORA-1",
          "norad_id": "55042",
          "stations": [
            "6a973f39-e396-48e6-bd15-db15fdddae03"
          ]
        },
        "properties": {
          "contact_email": {
            "anyOf": [
              {
                "maxLength": 320,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Contact Email"
          },
          "contact_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Contact Name"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 4000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "name": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "norad_id": {
            "maxLength": 16,
            "minLength": 1,
            "title": "Norad Id",
            "type": "string"
          },
          "omm": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Omm"
          },
          "owner_organization_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Owner Organization Id"
          },
          "stations": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Stations",
            "type": "array"
          },
          "tle1": {
            "anyOf": [
              {
                "maxLength": 69,
                "minLength": 69,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tle1"
          },
          "tle2": {
            "anyOf": [
              {
                "maxLength": 69,
                "minLength": 69,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tle2"
          }
        },
        "required": [
          "name",
          "norad_id"
        ],
        "title": "CreateSatelliteRequest",
        "type": "object"
      },
      "CreateTemplateRequest": {
        "additionalProperties": false,
        "example": {
          "default_at_station_id": "3c7f1a90-2e64-4b13-9d05-8a1f6c2b7e44",
          "description": "Routine telemetry downlink at Kiruna.",
          "name": "S-band downlink",
          "sections": {
            "3c7f1a90-2e64-4b13-9d05-8a1f6c2b7e44": {
              "config": {
                "rxdsp": {
                  "frequency_hz": 2245000000
                },
                "telemetry": {
                  "fec": "RS_255_223"
                }
              }
            }
          }
        },
        "properties": {
          "default_at_station_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default At Station Id"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "name": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "sections": {
            "additionalProperties": {
              "$ref": "#/components/schemas/SectionRequest"
            },
            "propertyNames": {
              "format": "uuid"
            },
            "title": "Sections",
            "type": "object"
          }
        },
        "required": [
          "name"
        ],
        "title": "CreateTemplateRequest",
        "type": "object"
      },
      "DownloadLink": {
        "additionalProperties": false,
        "properties": {
          "download_url": {
            "title": "Download Url",
            "type": "string"
          },
          "expires_at": {
            "format": "date-time",
            "title": "Expires At",
            "type": "string"
          },
          "expires_seconds": {
            "title": "Expires Seconds",
            "type": "integer"
          }
        },
        "required": [
          "download_url",
          "expires_at",
          "expires_seconds"
        ],
        "title": "DownloadLink",
        "type": "object"
      },
      "ElementsDriftReason": {
        "description": "Why one modem's elements do or do not match the hub's.\n\nThe verdict behind `elements_drift`. Only `in_sync` means nothing needs\ndoing; the rest each want a different response, which is why this is not a\nboolean.",
        "enum": [
          "in_sync",
          "local_override",
          "stale_online_update",
          "newer_than_hub",
          "differs",
          "not_read",
          "no_hub_elements",
          "reading_too_old",
          "superseded"
        ],
        "title": "ElementsDriftReason",
        "type": "string"
      },
      "ElementsOut": {
        "properties": {
          "drift": {
            "default": false,
            "title": "Drift",
            "type": "boolean"
          },
          "epoch": {
            "format": "date-time",
            "title": "Epoch",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "norad_id": {
            "title": "Norad Id",
            "type": "string"
          },
          "omm": {
            "additionalProperties": true,
            "title": "Omm",
            "type": "object"
          },
          "operator_set": {
            "default": false,
            "title": "Operator Set",
            "type": "boolean"
          },
          "satellite_id": {
            "format": "uuid",
            "title": "Satellite Id",
            "type": "string"
          },
          "source": {
            "title": "Source",
            "type": "string"
          },
          "stations": {
            "items": {
              "$ref": "#/components/schemas/StationElements"
            },
            "title": "Stations",
            "type": "array"
          },
          "tle1": {
            "title": "Tle1",
            "type": "string"
          },
          "tle2": {
            "title": "Tle2",
            "type": "string"
          },
          "updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Updated At"
          }
        },
        "required": [
          "satellite_id",
          "name",
          "source",
          "epoch",
          "tle1",
          "tle2",
          "norad_id"
        ],
        "title": "ElementsOut",
        "type": "object"
      },
      "Envelope_ActivityList_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ActivityList"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[ActivityList]",
        "type": "object"
      },
      "Envelope_AnnouncementFeed_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/AnnouncementFeed"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[AnnouncementFeed]",
        "type": "object"
      },
      "Envelope_BookReport_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookReport"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[BookReport]",
        "type": "object"
      },
      "Envelope_BookingPage_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingPage"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[BookingPage]",
        "type": "object"
      },
      "Envelope_BookingWindows_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingWindows"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[BookingWindows]",
        "type": "object"
      },
      "Envelope_CatalogObjectList_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CatalogObjectList"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[CatalogObjectList]",
        "type": "object"
      },
      "Envelope_CatalogObjectOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CatalogObjectOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[CatalogObjectOut]",
        "type": "object"
      },
      "Envelope_CatalogStatusOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CatalogStatusOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[CatalogStatusOut]",
        "type": "object"
      },
      "Envelope_CommandResult_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CommandResult"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[CommandResult]",
        "type": "object"
      },
      "Envelope_ConfigEventList_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ConfigEventList"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[ConfigEventList]",
        "type": "object"
      },
      "Envelope_ConflictList_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ConflictList"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[ConflictList]",
        "type": "object"
      },
      "Envelope_DownloadLink_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DownloadLink"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[DownloadLink]",
        "type": "object"
      },
      "Envelope_ElementsOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ElementsOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[ElementsOut]",
        "type": "object"
      },
      "Envelope_FileList_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FileList"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[FileList]",
        "type": "object"
      },
      "Envelope_FilesSummary_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FilesSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[FilesSummary]",
        "type": "object"
      },
      "Envelope_FramePage_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FramePage"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[FramePage]",
        "type": "object"
      },
      "Envelope_Me_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Me"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[Me]",
        "type": "object"
      },
      "Envelope_MemberListOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MemberListOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[MemberListOut]",
        "type": "object"
      },
      "Envelope_MintedToken_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MintedToken"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[MintedToken]",
        "type": "object"
      },
      "Envelope_MissionFieldList_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MissionFieldList"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[MissionFieldList]",
        "type": "object"
      },
      "Envelope_NotificationList_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/NotificationList"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[NotificationList]",
        "type": "object"
      },
      "Envelope_OrganizationSummary_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OrganizationSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[OrganizationSummary]",
        "type": "object"
      },
      "Envelope_PassDetail_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PassDetail"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[PassDetail]",
        "type": "object"
      },
      "Envelope_PassMissionParamsOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PassMissionParamsOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[PassMissionParamsOut]",
        "type": "object"
      },
      "Envelope_PassPage_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PassPage"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[PassPage]",
        "type": "object"
      },
      "Envelope_RecordingDefaultOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RecordingDefaultOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[RecordingDefaultOut]",
        "type": "object"
      },
      "Envelope_ReplaySummary_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ReplaySummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[ReplaySummary]",
        "type": "object"
      },
      "Envelope_SatelliteList_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SatelliteList"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[SatelliteList]",
        "type": "object"
      },
      "Envelope_SatelliteOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SatelliteOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[SatelliteOut]",
        "type": "object"
      },
      "Envelope_SecretRotated_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SecretRotated"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[SecretRotated]",
        "type": "object"
      },
      "Envelope_StationActionReport_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StationActionReport"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[StationActionReport]",
        "type": "object"
      },
      "Envelope_StationDefaultsOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StationDefaultsOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[StationDefaultsOut]",
        "type": "object"
      },
      "Envelope_StationList_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StationList"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[StationList]",
        "type": "object"
      },
      "Envelope_StationOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StationOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[StationOut]",
        "type": "object"
      },
      "Envelope_StreamInventory_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StreamInventory"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[StreamInventory]",
        "type": "object"
      },
      "Envelope_SystemStatus_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SystemStatus"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[SystemStatus]",
        "type": "object"
      },
      "Envelope_TemplateList_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TemplateList"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[TemplateList]",
        "type": "object"
      },
      "Envelope_TemplateOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TemplateOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[TemplateOut]",
        "type": "object"
      },
      "Envelope_TleOut_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/TleOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[TleOut]",
        "type": "object"
      },
      "Envelope_UnbookReport_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/UnbookReport"
              },
              {
                "type": "null"
              }
            ]
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[UnbookReport]",
        "type": "object"
      },
      "Envelope_dict_": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Data"
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[dict]",
        "type": "object"
      },
      "Envelope_list_str__": {
        "properties": {
          "data": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Data"
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "description": "ok or error",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "status",
          "message",
          "request_id",
          "timestamp"
        ],
        "title": "Envelope[list[str]]",
        "type": "object"
      },
      "ErrorCode": {
        "enum": [
          "bearer_missing",
          "bearer_invalid",
          "token_verification_unavailable",
          "role_missing",
          "scope_missing",
          "validation_error",
          "not_found",
          "conflict",
          "upstream_error",
          "satellite_not_owned",
          "satellite_name_conflict",
          "satellite_not_pending",
          "station_not_permitted",
          "station_offline",
          "not_implemented",
          "service_unavailable",
          "internal_error",
          "invalid_filter_combination",
          "rate_limited",
          "booked_by_not_allowed",
          "command_not_permitted",
          "mission_field_not_permitted",
          "pass_locked",
          "pass_in_progress",
          "template_not_found"
        ],
        "title": "ErrorCode",
        "type": "string"
      },
      "ErrorEnvelope": {
        "description": "Every failed response, at every status code.\n\nThe success envelope with `status: \"error\"` and an `ErrorPayload` in\n`data`. Published so a client has one shape to decode. FastAPI's default\n`{\"detail\": [...]}` is documented by generated specs but is NOT what this\nAPI sends, including on 422.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ErrorPayload"
          },
          "message": {
            "title": "Message",
            "type": "string"
          },
          "request_id": {
            "description": "Correlates with the `X-Request-ID` response header.",
            "title": "Request Id",
            "type": "string"
          },
          "status": {
            "default": "error",
            "description": "Always \"error\" here.",
            "title": "Status",
            "type": "string"
          },
          "timestamp": {
            "description": "Unix epoch MILLISECONDS.",
            "title": "Timestamp",
            "type": "integer"
          }
        },
        "required": [
          "message",
          "data",
          "request_id",
          "timestamp"
        ],
        "title": "ErrorEnvelope",
        "type": "object"
      },
      "ErrorPayload": {
        "description": "The `data` of a failed response.\n\nBranch on `error_code`, never on `message`: the code is the contract and\nthe message is prose that may be reworded.",
        "properties": {
          "details": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Extra context, shaped per `error_code`, for example `locks_at` on `pass_locked`, `rejected` on `mission_field_not_permitted`, `available` on an unknown station reading.",
            "title": "Details"
          },
          "error_code": {
            "$ref": "#/components/schemas/ErrorCode",
            "description": "Machine-readable cause. The full set is this enum."
          },
          "message": {
            "description": "Human-readable explanation.",
            "title": "Message",
            "type": "string"
          }
        },
        "required": [
          "error_code",
          "message"
        ],
        "title": "ErrorPayload",
        "type": "object"
      },
      "FieldConditionOut": {
        "description": "\"This applies only while <path> holds one of <in_>.\"\n\nOne predicate over one field, mirroring the agent's `FieldCondition`. Not\nan expression language: every real rule is of this shape, and the renderer\nthat has to evaluate it client-side stays a dozen lines.",
        "properties": {
          "in": {
            "items": {
              "type": "string"
            },
            "title": "In",
            "type": "array"
          },
          "path": {
            "title": "Path",
            "type": "string"
          }
        },
        "required": [
          "path",
          "in"
        ],
        "title": "FieldConditionOut",
        "type": "object"
      },
      "FieldVerdictOut": {
        "description": "What happened to one submitted field, and why.\n\n`detail` carries whatever the reason needs, such as the controlling field for\n`readonly_field` and `inapplicable`, the valid set for `not_an_option`,\n`from`/`to` for `coerced`, rather than a column per reason that is null\nfor every other one.",
        "properties": {
          "detail": {
            "additionalProperties": true,
            "title": "Detail",
            "type": "object"
          },
          "path": {
            "title": "Path",
            "type": "string"
          },
          "reason": {
            "title": "Reason",
            "type": "string"
          }
        },
        "required": [
          "path",
          "reason"
        ],
        "title": "FieldVerdictOut",
        "type": "object"
      },
      "FileList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/FileOut"
            },
            "title": "Items",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "items"
        ],
        "title": "FileList",
        "type": "object"
      },
      "FileOut": {
        "additionalProperties": false,
        "properties": {
          "booking_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Booking Id"
          },
          "captured_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Captured At"
          },
          "content_type": {
            "title": "Content Type",
            "type": "string"
          },
          "filename": {
            "title": "Filename",
            "type": "string"
          },
          "group": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Group"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "satellite": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/app__domains__files__schemas__SatelliteRef"
              },
              {
                "type": "null"
              }
            ]
          },
          "size_bytes": {
            "title": "Size Bytes",
            "type": "integer"
          },
          "station": {
            "$ref": "#/components/schemas/StationRef"
          },
          "status": {
            "$ref": "#/components/schemas/FileState"
          },
          "uploaded_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Uploaded At"
          }
        },
        "required": [
          "id",
          "filename",
          "size_bytes",
          "content_type",
          "status",
          "station"
        ],
        "title": "FileOut",
        "type": "object"
      },
      "FileState": {
        "description": "Where a file is in the upload flow.\n\nNamed as an enum rather than spelled out as literals at each use so the\npublished spec carries the members and a generated client gets the union\ninstead of a hand-written one. The values are lower case and are the whole\ncontract. A client comparing against `COMPLETED` matches nothing, which is\nhow every completed file came to look unfinished in the portal.",
        "enum": [
          "pending",
          "completed",
          "failed"
        ],
        "title": "FileState",
        "type": "string"
      },
      "FilesGroup": {
        "additionalProperties": false,
        "properties": {
          "bytes": {
            "title": "Bytes",
            "type": "integer"
          },
          "files": {
            "title": "Files",
            "type": "integer"
          },
          "first_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "First At"
          },
          "last_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last At"
          },
          "satellite": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/app__domains__files__schemas__SatelliteRef"
              },
              {
                "type": "null"
              }
            ]
          },
          "station": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StationRef"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "files",
          "bytes"
        ],
        "title": "FilesGroup",
        "type": "object"
      },
      "FilesSummary": {
        "additionalProperties": false,
        "properties": {
          "bytes": {
            "title": "Bytes",
            "type": "integer"
          },
          "files": {
            "title": "Files",
            "type": "integer"
          },
          "groups": {
            "items": {
              "$ref": "#/components/schemas/FilesGroup"
            },
            "title": "Groups",
            "type": "array"
          }
        },
        "required": [
          "files",
          "bytes",
          "groups"
        ],
        "title": "FilesSummary",
        "type": "object"
      },
      "FrameOut": {
        "additionalProperties": false,
        "properties": {
          "at": {
            "format": "date-time",
            "title": "At",
            "type": "string"
          },
          "captured_at": {
            "format": "date-time",
            "title": "Captured At",
            "type": "string"
          },
          "frame_b64": {
            "title": "Frame B64",
            "type": "string"
          },
          "id": {
            "title": "Id",
            "type": "integer"
          },
          "stream": {
            "title": "Stream",
            "type": "string"
          }
        },
        "required": [
          "id",
          "stream",
          "captured_at",
          "at",
          "frame_b64"
        ],
        "title": "FrameOut",
        "type": "object"
      },
      "FramePage": {
        "additionalProperties": false,
        "properties": {
          "frames": {
            "items": {
              "$ref": "#/components/schemas/FrameOut"
            },
            "title": "Frames",
            "type": "array"
          },
          "next_after": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next After"
          },
          "total": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Total"
          }
        },
        "required": [
          "frames"
        ],
        "title": "FramePage",
        "type": "object"
      },
      "GeoWindow": {
        "additionalProperties": false,
        "description": "Always in view: no rise, no set, and therefore no window at all.\n\nIt still has an ELEVATION. A geostationary satellite sits at one bearing\nfrom a given dish, so the number is constant rather than a peak. It is\nis the same measurement `Leo.max_elevation_deg` carries, reported by the\nsame station on the same field, and it decides whether a site can work the\nbird at all. The station has always sent it and `passes` has\nalways stored it; this schema had nowhere to put it, so it was dropped on\nthe way out and every geostationary pass read as having no elevation.\n\nKept under the same name as `Leo`'s so one reader answers both.",
        "properties": {
          "max_elevation_deg": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Elevation Deg"
          },
          "type": {
            "const": "geo",
            "default": "geo",
            "title": "Type",
            "type": "string"
          }
        },
        "title": "GeoWindow",
        "type": "object"
      },
      "Leo": {
        "additionalProperties": false,
        "description": "Rises and sets inside the horizon. Also the shape a MEO or HEO pass\ntakes, bounded at both ends.",
        "properties": {
          "aos": {
            "format": "date-time",
            "title": "Aos",
            "type": "string"
          },
          "los": {
            "format": "date-time",
            "title": "Los",
            "type": "string"
          },
          "max_elevation_deg": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Elevation Deg"
          },
          "type": {
            "const": "leo",
            "default": "leo",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "aos",
          "los"
        ],
        "title": "Leo",
        "type": "object"
      },
      "MarkRead": {
        "additionalProperties": false,
        "example": {
          "ids": [
            "b2d4e6f8-0a1c-4e3d-8f5a-9c7b6d5e4f32",
            "7e5c3a19-8b2d-4f60-a1c3-5d7e9f0b2a46"
          ]
        },
        "properties": {
          "ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "title": "MarkRead",
        "type": "object"
      },
      "Me": {
        "additionalProperties": false,
        "description": "The caller, named rather than merely identified.\n\nIds and names together, the same `Ref` every other payload uses: the\ndirectory is the hub's to reach, not the browser's, so an endpoint that\nsent bare UUIDs would force the portal to render one or invent its own\nlookup. The sidebar was printing a realm role where the organization\nbelongs precisely because this answer carried no name to print.",
        "properties": {
          "client_origin_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "OIDC `azp`: which client obtained the token. For auditing, not authority.",
            "title": "Client Origin Id"
          },
          "home_organization": {
            "$ref": "#/components/schemas/Ref",
            "description": "The organization the caller's own token names. Never changes, whatever they are acting as."
          },
          "is_admin": {
            "description": "This caller MAY act for organizations other than their own. Gate an organization switcher on it. It does not say the current request carries that authority. What this request acts as is `organization`. False for an ordinary API credential.",
            "title": "Is Admin",
            "type": "boolean"
          },
          "organization": {
            "$ref": "#/components/schemas/Ref",
            "description": "The organization this request ACTS AS. Everything you read and write is scoped to it. Equal to `home_organization` unless the caller has switched into another organization they are permitted to act for."
          },
          "user": {
            "$ref": "#/components/schemas/Ref"
          },
          "username": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Username"
          }
        },
        "required": [
          "user",
          "organization",
          "home_organization",
          "is_admin"
        ],
        "title": "Me",
        "type": "object"
      },
      "Member": {
        "description": "One person, as membership management needs them.\n\nIdentity and contact only. Roles are not here: what a member may DO comes\nfrom their realm roles and the organization's grants, and duplicating a\nsubset of that into this listing would be a second answer to a question\nthat already has one.",
        "properties": {
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email"
          },
          "first_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "First Name"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "last_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Name"
          },
          "username": {
            "title": "Username",
            "type": "string"
          }
        },
        "required": [
          "id",
          "username"
        ],
        "title": "Member",
        "type": "object"
      },
      "MemberListOut": {
        "properties": {
          "members": {
            "items": {
              "$ref": "#/components/schemas/Member"
            },
            "title": "Members",
            "type": "array"
          }
        },
        "required": [
          "members"
        ],
        "title": "MemberListOut",
        "type": "object"
      },
      "MintedToken": {
        "properties": {
          "access_token": {
            "title": "Access Token",
            "type": "string"
          },
          "expires_in": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires In"
          },
          "token_type": {
            "default": "Bearer",
            "title": "Token Type",
            "type": "string"
          }
        },
        "required": [
          "access_token"
        ],
        "title": "MintedToken",
        "type": "object"
      },
      "MissionFieldList": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/MissionFieldOut"
            },
            "title": "Items",
            "type": "array"
          },
          "read_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Read At"
          },
          "station_id": {
            "format": "uuid",
            "title": "Station Id",
            "type": "string"
          }
        },
        "required": [
          "station_id"
        ],
        "title": "MissionFieldList",
        "type": "object"
      },
      "MissionFieldOut": {
        "description": "One settable field, as the station described it plus the hub's policy.",
        "properties": {
          "advanced": {
            "default": false,
            "title": "Advanced",
            "type": "boolean"
          },
          "category": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Category"
          },
          "chain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Chain"
          },
          "editable": {
            "default": true,
            "title": "Editable",
            "type": "boolean"
          },
          "hidden": {
            "default": false,
            "title": "Hidden",
            "type": "boolean"
          },
          "hint": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Hint"
          },
          "label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Label"
          },
          "options": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Options"
          },
          "order": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Order"
          },
          "path": {
            "title": "Path",
            "type": "string"
          },
          "readonly_when": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FieldConditionOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "required": {
            "default": true,
            "title": "Required",
            "type": "boolean"
          },
          "section": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Section"
          },
          "step": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Step"
          },
          "type": {
            "default": "text",
            "title": "Type",
            "type": "string"
          },
          "unit": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Unit"
          },
          "value": {
            "anyOf": [
              {},
              {
                "type": "null"
              }
            ],
            "title": "Value"
          },
          "visible_when": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/FieldConditionOut"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "path"
        ],
        "title": "MissionFieldOut",
        "type": "object"
      },
      "NotificationKind": {
        "enum": [
          "booking_confirmed",
          "booking_cancelled",
          "pass_starting_soon",
          "pass_started",
          "pass_ended",
          "pass_drifted",
          "pass_trimmed",
          "pass_cancelled_locally",
          "pass_refused_at_modem",
          "station_offline",
          "station_recovered",
          "mission_data_ready",
          "satellite_approved",
          "satellite_rejected",
          "upload_failed",
          "satellite_elements_diverged",
          "mission_template_fields_changed"
        ],
        "title": "NotificationKind",
        "type": "string"
      },
      "NotificationList": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/NotificationOut"
            },
            "title": "Items",
            "type": "array"
          },
          "unread": {
            "title": "Unread",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "unread"
        ],
        "title": "NotificationList",
        "type": "object"
      },
      "NotificationOut": {
        "additionalProperties": false,
        "properties": {
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Body"
          },
          "booking_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Booking Id"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "$ref": "#/components/schemas/NotificationKind"
          },
          "pass_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pass Id"
          },
          "read": {
            "title": "Read",
            "type": "boolean"
          },
          "station_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Station Id"
          },
          "title": {
            "title": "Title",
            "type": "string"
          }
        },
        "required": [
          "id",
          "kind",
          "title",
          "created_at",
          "read"
        ],
        "title": "NotificationOut",
        "type": "object"
      },
      "Open": {
        "additionalProperties": false,
        "properties": {
          "status": {
            "const": "open",
            "default": "open",
            "title": "Status",
            "type": "string"
          }
        },
        "title": "Open",
        "type": "object"
      },
      "OpenEnd": {
        "additionalProperties": false,
        "description": "Rises inside the horizon and sets past its edge.",
        "properties": {
          "aos": {
            "format": "date-time",
            "title": "Aos",
            "type": "string"
          },
          "type": {
            "const": "open_end",
            "default": "open_end",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "aos"
        ],
        "title": "OpenEnd",
        "type": "object"
      },
      "OpenStart": {
        "additionalProperties": false,
        "description": "In view now; the rise is behind the start of the prediction horizon.",
        "properties": {
          "los": {
            "format": "date-time",
            "title": "Los",
            "type": "string"
          },
          "type": {
            "const": "open_start",
            "default": "open_start",
            "title": "Type",
            "type": "string"
          }
        },
        "required": [
          "los"
        ],
        "title": "OpenStart",
        "type": "object"
      },
      "OrbitClass": {
        "description": "Which orbital regime an element set puts a satellite in.\n\nStored ON THE ELEMENTS, not on the satellite, because it is a function\nof the OMM beside it, written in the same statement so the two cannot\ndrift. On the satellite it would live in a different table from its own\ninput and go stale the moment a catalogue refresh moved the orbit.",
        "enum": [
          "leo",
          "meo",
          "geo",
          "heo"
        ],
        "title": "OrbitClass",
        "type": "string"
      },
      "OrganizationSummary": {
        "description": "An organization, by identity.\n\nIts name, its alias, and the client id its API credentials use.",
        "properties": {
          "alias": {
            "title": "Alias",
            "type": "string"
          },
          "api_client_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Api Client Id"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "alias"
        ],
        "title": "OrganizationSummary",
        "type": "object"
      },
      "PassDetail": {
        "additionalProperties": false,
        "properties": {
          "availability": {
            "discriminator": {
              "mapping": {
                "booked": "#/components/schemas/Booked",
                "open": "#/components/schemas/Open",
                "unavailable": "#/components/schemas/Unavailable"
              },
              "propertyName": "status"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/Open"
              },
              {
                "$ref": "#/components/schemas/Booked"
              },
              {
                "$ref": "#/components/schemas/Unavailable"
              }
            ],
            "title": "Availability"
          },
          "booking": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/BookingDetail"
              },
              {
                "type": "null"
              }
            ]
          },
          "elements_epoch": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Elements Epoch"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "predicted_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Predicted At"
          },
          "realtime": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RealtimeWindow"
              },
              {
                "type": "null"
              }
            ]
          },
          "satellite": {
            "$ref": "#/components/schemas/app__domains__passes__schemas__SatelliteRef"
          },
          "segments": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/SegmentOut"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Segments"
          },
          "station": {
            "$ref": "#/components/schemas/StationRef"
          },
          "window": {
            "discriminator": {
              "mapping": {
                "geo": "#/components/schemas/GeoWindow",
                "leo": "#/components/schemas/Leo",
                "open_end": "#/components/schemas/OpenEnd",
                "open_start": "#/components/schemas/OpenStart"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/GeoWindow"
              },
              {
                "$ref": "#/components/schemas/Leo"
              },
              {
                "$ref": "#/components/schemas/OpenStart"
              },
              {
                "$ref": "#/components/schemas/OpenEnd"
              }
            ],
            "title": "Window"
          }
        },
        "required": [
          "id",
          "station",
          "satellite",
          "window",
          "availability"
        ],
        "title": "PassDetail",
        "type": "object"
      },
      "PassMissionParamsOut": {
        "additionalProperties": false,
        "description": "`MissionParamsOut` plus the outcome of the trip to the station.\n\nExtends rather than duplicates: the mission-parameter shape belongs to the\nmissions domain, and only the `/passes` routes can push to a station, so\nonly they have an outcome to report.",
        "properties": {
          "booking_id": {
            "format": "uuid",
            "title": "Booking Id",
            "type": "string"
          },
          "config": {
            "additionalProperties": true,
            "title": "Config",
            "type": "object"
          },
          "editable": {
            "title": "Editable",
            "type": "boolean"
          },
          "editable_fields": {
            "items": {
              "type": "string"
            },
            "title": "Editable Fields",
            "type": "array"
          },
          "effective_config": {
            "additionalProperties": true,
            "title": "Effective Config",
            "type": "object"
          },
          "lock_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lock Reason"
          },
          "locks_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Locks At"
          },
          "recorder_enabled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Recorder Enabled"
          },
          "report": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/WriteReportOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "repush": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Repush"
              },
              {
                "type": "null"
              }
            ]
          },
          "resolved_from": {
            "items": {
              "type": "string"
            },
            "title": "Resolved From",
            "type": "array"
          },
          "template_config": {
            "additionalProperties": true,
            "title": "Template Config",
            "type": "object"
          }
        },
        "required": [
          "booking_id",
          "editable"
        ],
        "title": "PassMissionParamsOut",
        "type": "object"
      },
      "PassOut": {
        "additionalProperties": false,
        "properties": {
          "availability": {
            "discriminator": {
              "mapping": {
                "booked": "#/components/schemas/Booked",
                "open": "#/components/schemas/Open",
                "unavailable": "#/components/schemas/Unavailable"
              },
              "propertyName": "status"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/Open"
              },
              {
                "$ref": "#/components/schemas/Booked"
              },
              {
                "$ref": "#/components/schemas/Unavailable"
              }
            ],
            "title": "Availability"
          },
          "elements_epoch": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Elements Epoch"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "predicted_at": {
            "format": "date-time",
            "title": "Predicted At",
            "type": "string"
          },
          "satellite": {
            "$ref": "#/components/schemas/app__domains__passes__schemas__SatelliteRef"
          },
          "segments": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/SegmentOut"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Segments"
          },
          "station": {
            "$ref": "#/components/schemas/StationRef"
          },
          "window": {
            "discriminator": {
              "mapping": {
                "geo": "#/components/schemas/GeoWindow",
                "leo": "#/components/schemas/Leo",
                "open_end": "#/components/schemas/OpenEnd",
                "open_start": "#/components/schemas/OpenStart"
              },
              "propertyName": "type"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/GeoWindow"
              },
              {
                "$ref": "#/components/schemas/Leo"
              },
              {
                "$ref": "#/components/schemas/OpenStart"
              },
              {
                "$ref": "#/components/schemas/OpenEnd"
              }
            ],
            "title": "Window"
          }
        },
        "required": [
          "id",
          "station",
          "satellite",
          "window",
          "availability",
          "predicted_at"
        ],
        "title": "PassOut",
        "type": "object"
      },
      "PassPage": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/PassOut"
            },
            "title": "Items",
            "type": "array"
          },
          "next_cursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Cursor"
          }
        },
        "required": [
          "items"
        ],
        "title": "PassPage",
        "type": "object"
      },
      "PassStatus": {
        "enum": [
          "open",
          "booked",
          "unavailable"
        ],
        "title": "PassStatus",
        "type": "string"
      },
      "PassTiming": {
        "description": "When this driver wants its pass hooks fired, in seconds.\n\nNOT the turnaround buffer. That is hub policy: `TURNAROUND_BUFFER_SECONDS`\nblocks `[aos - buffer, los + buffer]` so adjacent bookings cannot collide\nduring dish slew, is enforced when checking booking overlap, and is never\nreported by an agent. These two are driver characteristics: Expedite asks\nfor lead time because applying a mission is a file swap, and another vendor\nwould answer differently. Both default to 300 today, which is why they are\neasy to confuse.",
        "properties": {
          "postpass_grace": {
            "title": "Postpass Grace",
            "type": "integer"
          },
          "prepass_lead": {
            "title": "Prepass Lead",
            "type": "integer"
          }
        },
        "required": [
          "prepass_lead",
          "postpass_grace"
        ],
        "title": "PassTiming",
        "type": "object"
      },
      "PatchMissionParamsRequest": {
        "additionalProperties": false,
        "example": {
          "config": {
            "rxdsp": {
              "frequency_hz": 2245000000
            },
            "telemetry": {
              "fec": "RS_255_223",
              "scrambler": "CCSDS"
            }
          },
          "recorder_enabled": true
        },
        "properties": {
          "config": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Config"
          },
          "recorder_enabled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Recorder Enabled"
          }
        },
        "title": "PatchMissionParamsRequest",
        "type": "object"
      },
      "Person": {
        "additionalProperties": false,
        "description": "A human and the organization they acted for.\n\nRendered as `name/organization` wherever one is named: the booker of a\npass, or the author of a configuration change. That is why both refs are\nhere rather than left to the caller to join.",
        "properties": {
          "email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Email"
          },
          "organization": {
            "$ref": "#/components/schemas/Ref"
          },
          "user": {
            "$ref": "#/components/schemas/Ref"
          },
          "username": {
            "title": "Username",
            "type": "string"
          }
        },
        "required": [
          "user",
          "organization",
          "username"
        ],
        "title": "Person",
        "type": "object"
      },
      "RealtimeWindow": {
        "additionalProperties": false,
        "description": "When this booking's live streams are open.\n\nThe same window `/ws/realtime` enforces, so the console opens and closes on\nthe hub's answer instead of re-deriving one from AOS and a buffer it had to\nassume. `[starts_at - turnaround, ends_at]`, with the lead-in clamped: the\nantenna belongs to the previous pass until its own LOS.",
        "properties": {
          "closes_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Closes At"
          },
          "may_transmit": {
            "default": false,
            "title": "May Transmit",
            "type": "boolean"
          },
          "opens_at": {
            "format": "date-time",
            "title": "Opens At",
            "type": "string"
          },
          "truncated_by_other_org": {
            "default": false,
            "title": "Truncated By Other Org",
            "type": "boolean"
          },
          "turnaround_seconds": {
            "title": "Turnaround Seconds",
            "type": "integer"
          }
        },
        "required": [
          "opens_at",
          "turnaround_seconds"
        ],
        "title": "RealtimeWindow",
        "type": "object"
      },
      "RecordingDefaultOut": {
        "additionalProperties": false,
        "properties": {
          "owner_organization_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Owner Organization Id"
          },
          "record_by_default": {
            "title": "Record By Default",
            "type": "boolean"
          },
          "satellite_id": {
            "format": "uuid",
            "title": "Satellite Id",
            "type": "string"
          }
        },
        "required": [
          "satellite_id",
          "record_by_default"
        ],
        "title": "RecordingDefaultOut",
        "type": "object"
      },
      "RecordingRetention": {
        "description": "How long the station keeps its own recordings, as its modem reports it.\n\nThis is a station setting. Umoja reads it but never changes it. When\n`at_risk` is true, the station deletes recordings before Umoja has finished\nretrying their upload, so a hub outage longer than `limit_hours` loses data.",
        "properties": {
          "at_risk": {
            "default": false,
            "title": "At Risk",
            "type": "boolean"
          },
          "auto_delete": {
            "title": "Auto Delete",
            "type": "boolean"
          },
          "limit_hours": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Limit Hours"
          }
        },
        "required": [
          "auto_delete"
        ],
        "title": "RecordingRetention",
        "type": "object"
      },
      "Ref": {
        "additionalProperties": false,
        "description": "An id with the name that goes on screen beside it.\n\nBoth, always. The id is what other calls take and what a bug report\nquotes; the name is the only half a person can read. A payload carrying\njust the id makes every caller resolve it, and they cannot:\ndirectory is the hub's to reach, not the browser's.\n\n`name` falls back to the id when the directory cannot answer, so it is\nnever empty and a caller never has to decide what to show instead.",
        "properties": {
          "id": {
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "Ref",
        "type": "object"
      },
      "ReplaySummary": {
        "additionalProperties": false,
        "properties": {
          "booking_id": {
            "format": "uuid",
            "title": "Booking Id",
            "type": "string"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ends At"
          },
          "graph_streams": {
            "items": {
              "type": "string"
            },
            "title": "Graph Streams",
            "type": "array"
          },
          "starts_at": {
            "format": "date-time",
            "title": "Starts At",
            "type": "string"
          },
          "ttc": {
            "items": {
              "$ref": "#/components/schemas/StreamSummary"
            },
            "title": "Ttc",
            "type": "array"
          }
        },
        "required": [
          "booking_id",
          "starts_at",
          "ttc",
          "graph_streams"
        ],
        "title": "ReplaySummary",
        "type": "object"
      },
      "Repush": {
        "additionalProperties": false,
        "description": "Whether a late edit actually reached the modem.\n\nAn edit inside the lock window asks to change a pass the station is already\nconfigured for, so storing it is only half the operation: the station has\nto accept it too. This says whether it did.\n\nAbsent when no push was needed. An edit outside the lock window is simply\nstored, and the station reads it at prepass.",
        "properties": {
          "message": {
            "title": "Message",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/RepushStatus"
          }
        },
        "required": [
          "status",
          "message"
        ],
        "title": "Repush",
        "type": "object"
      },
      "RepushStatus": {
        "description": "What became of a late edit's trip to the station.",
        "enum": [
          "sent",
          "station_offline",
          "unsupported",
          "failed"
        ],
        "title": "RepushStatus",
        "type": "string"
      },
      "SatelliteList": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/SatelliteOut"
            },
            "title": "Items",
            "type": "array"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "title": "SatelliteList",
        "type": "object"
      },
      "SatelliteOrigin": {
        "enum": [
          "station",
          "portal"
        ],
        "title": "SatelliteOrigin",
        "type": "string"
      },
      "SatelliteOut": {
        "properties": {
          "approval_status": {
            "$ref": "#/components/schemas/ApprovalStatus"
          },
          "approved_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Approved At"
          },
          "awaiting_elements": {
            "default": false,
            "description": "Registered but with no orbital elements yet, so it cannot be tracked. Supply them with `PUT /satellites/{id}/tle`.",
            "title": "Awaiting Elements",
            "type": "boolean"
          },
          "can_edit": {
            "default": false,
            "description": "This caller may change this satellite. Not the same as `owned`: the two can differ, so gate your edit controls on THIS.",
            "title": "Can Edit",
            "type": "boolean"
          },
          "contact_email": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Contact Email"
          },
          "contact_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Contact Name"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "elements_drift": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "An assigned station is known to hold a different element set, or has never been read. Says the two DIFFER, not which is right.",
            "title": "Elements Drift"
          },
          "elements_epoch": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Elements Epoch"
          },
          "elements_source": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Where the elements in force came from: `override` (set by an operator), `catalog` (the CelesTrak mirror), or `station` (read off a modem).",
            "title": "Elements Source"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "norad_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Norad Id"
          },
          "omm": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Omm"
          },
          "orbit_class": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OrbitClass"
              },
              {
                "type": "null"
              }
            ]
          },
          "origin": {
            "$ref": "#/components/schemas/SatelliteOrigin"
          },
          "owned": {
            "default": false,
            "description": "Your organization owns this satellite. Ownership is the right to change it; access to BOOK it is separate and not implied here.",
            "title": "Owned",
            "type": "boolean"
          },
          "owner_organization_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Owner Organization Id"
          },
          "record_by_default": {
            "default": true,
            "title": "Record By Default",
            "type": "boolean"
          },
          "rejected_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rejected Reason"
          },
          "stations": {
            "items": {
              "$ref": "#/components/schemas/StationLink"
            },
            "title": "Stations",
            "type": "array"
          },
          "tle1": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tle1"
          },
          "tle2": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tle2"
          }
        },
        "required": [
          "id",
          "name",
          "origin",
          "approval_status",
          "created_at"
        ],
        "title": "SatelliteOut",
        "type": "object"
      },
      "Scope": {
        "enum": [
          "me",
          "org",
          "any"
        ],
        "title": "Scope",
        "type": "string"
      },
      "SecretRotated": {
        "properties": {
          "api_client_id": {
            "title": "Api Client Id",
            "type": "string"
          },
          "client_secret": {
            "title": "Client Secret",
            "type": "string"
          }
        },
        "required": [
          "api_client_id",
          "client_secret"
        ],
        "title": "SecretRotated",
        "type": "object"
      },
      "SectionOut": {
        "additionalProperties": false,
        "description": "One template's settings for one station.",
        "properties": {
          "config": {
            "additionalProperties": true,
            "title": "Config",
            "type": "object"
          },
          "is_default": {
            "default": false,
            "title": "Is Default",
            "type": "boolean"
          },
          "stale_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Stale At"
          },
          "stale_reasons": {
            "items": {
              "$ref": "#/components/schemas/FieldVerdictOut"
            },
            "title": "Stale Reasons",
            "type": "array"
          },
          "station_id": {
            "format": "uuid",
            "title": "Station Id",
            "type": "string"
          },
          "station_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Station Name"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "station_id",
          "updated_at"
        ],
        "title": "SectionOut",
        "type": "object"
      },
      "SectionRequest": {
        "additionalProperties": false,
        "description": "A template's settings for one station, as submitted.",
        "properties": {
          "config": {
            "additionalProperties": true,
            "title": "Config",
            "type": "object"
          }
        },
        "title": "SectionRequest",
        "type": "object"
      },
      "SegmentOut": {
        "additionalProperties": false,
        "description": "One bookable stretch of a pass, on the wire.\n\n`SegmentOut`, not `PassSegment`: the ORM table of that name is the stored\nrow, and having both in one import graph was a collision waiting for the\nfirst file that needed the two together. Named for the DTO convention the\nrest of this module already follows: `PassOut`, `BookingOut`, `Ref`.",
        "properties": {
          "availability": {
            "discriminator": {
              "mapping": {
                "booked": "#/components/schemas/Booked",
                "open": "#/components/schemas/Open",
                "unavailable": "#/components/schemas/Unavailable"
              },
              "propertyName": "status"
            },
            "oneOf": [
              {
                "$ref": "#/components/schemas/Open"
              },
              {
                "$ref": "#/components/schemas/Booked"
              },
              {
                "$ref": "#/components/schemas/Unavailable"
              }
            ],
            "title": "Availability"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ends At"
          },
          "starts_at": {
            "format": "date-time",
            "title": "Starts At",
            "type": "string"
          }
        },
        "required": [
          "starts_at"
        ],
        "title": "SegmentOut",
        "type": "object"
      },
      "ServiceHealth": {
        "additionalProperties": false,
        "properties": {
          "detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Detail"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "ok": {
            "title": "Ok",
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "ok"
        ],
        "title": "ServiceHealth",
        "type": "object"
      },
      "SessionWindow": {
        "additionalProperties": false,
        "description": "An explicit window, for a satellite that is always in view.\n\nRequired for one, and REFUSED for anything else. A pass that rises and\nsets already has its window (the prediction is the window) and a\nbooking that quietly disagreed with it would be reserving antenna time\nagainst a pass the station is not going to fly then.\n\n`ends_at` may be omitted, which holds the antenna until the booking is\nreleased. Only a continuously visible satellite may be booked that way:\nanything that sets has an end whether or not the caller names one.",
        "properties": {
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ends At"
          },
          "starts_at": {
            "format": "date-time",
            "title": "Starts At",
            "type": "string"
          }
        },
        "required": [
          "starts_at"
        ],
        "title": "SessionWindow",
        "type": "object"
      },
      "SetRecorderRequest": {
        "additionalProperties": false,
        "example": {
          "enabled": true
        },
        "properties": {
          "enabled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Enabled"
          }
        },
        "title": "SetRecorderRequest",
        "type": "object"
      },
      "SetRecordingDefaultRequest": {
        "additionalProperties": false,
        "example": {
          "record_by_default": true
        },
        "properties": {
          "record_by_default": {
            "title": "Record By Default",
            "type": "boolean"
          }
        },
        "required": [
          "record_by_default"
        ],
        "title": "SetRecordingDefaultRequest",
        "type": "object"
      },
      "SetStationsRequest": {
        "additionalProperties": false,
        "example": {
          "stations": [
            "6a973f39-e396-48e6-bd15-db15fdddae03",
            "930793e4-f9d4-41ef-9750-f9a63d8ad439"
          ]
        },
        "properties": {
          "stations": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "title": "Stations",
            "type": "array"
          }
        },
        "title": "SetStationsRequest",
        "type": "object"
      },
      "SetTleRequest": {
        "additionalProperties": false,
        "description": "One element set, as an OMM record or as two lines. No name.\n\nOMM is the form the hub stores, so a caller holding one sends it\nuntouched: rendering it to lines first and parsing them back drops every\nfield a TLE has no column for, which is the whole reason the newer format\nexists. Two lines stay accepted because that is what a non-OMM modem\nreports and what an operator pastes from a legacy feed; the hub converts\nthem on the way in.\n\nExpedite's legacy 3-line push needs a name, but that is a wire detail: the\nhub fills it from `satellites.name` at dispatch. Accepting one here would\nlet a caller set a name that disagrees with the satellite's own, and\n`TLEManager::OfflineUpdate` files by name, so a mismatch creates a second\nentry in the modem's catalog instead of updating the first.\n\nExactly one form per request. Both fields are optional so either can be\nsent, and `_exactly_one_form` is what makes the pair defined: a body with\nneither, with both, or with a single line is refused rather than stored\nhalf-read.",
        "example": {
          "omm": {
            "ARG_OF_PERICENTER": 88.1204,
            "BSTAR": 0.00012345,
            "CLASSIFICATION_TYPE": "U",
            "ECCENTRICITY": 0.0011733,
            "ELEMENT_SET_NO": 999,
            "EPHEMERIS_TYPE": 0,
            "EPOCH": "2026-09-20T04:12:33.120576",
            "INCLINATION": 97.4501,
            "MEAN_ANOMALY": 272.0417,
            "MEAN_MOTION": 15.19472182,
            "MEAN_MOTION_DDOT": 0,
            "MEAN_MOTION_DOT": 2.31e-06,
            "NORAD_CAT_ID": 55042,
            "OBJECT_ID": "2023-001A",
            "OBJECT_NAME": "AURORA-1",
            "RA_OF_ASC_NODE": 210.3312,
            "REV_AT_EPOCH": 15884
          }
        },
        "properties": {
          "omm": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Omm"
          },
          "tle1": {
            "anyOf": [
              {
                "maxLength": 69,
                "minLength": 69,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tle1"
          },
          "tle2": {
            "anyOf": [
              {
                "maxLength": 69,
                "minLength": 69,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tle2"
          }
        },
        "title": "SetTleRequest",
        "type": "object"
      },
      "StationActionReport": {
        "properties": {
          "results": {
            "items": {
              "$ref": "#/components/schemas/StationActionResult"
            },
            "title": "Results",
            "type": "array"
          },
          "satellite_id": {
            "format": "uuid",
            "title": "Satellite Id",
            "type": "string"
          }
        },
        "required": [
          "satellite_id"
        ],
        "title": "StationActionReport",
        "type": "object"
      },
      "StationActionResult": {
        "properties": {
          "detail": {
            "title": "Detail",
            "type": "string"
          },
          "epoch": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Epoch"
          },
          "ok": {
            "title": "Ok",
            "type": "boolean"
          },
          "station_id": {
            "format": "uuid",
            "title": "Station Id",
            "type": "string"
          }
        },
        "required": [
          "station_id",
          "ok",
          "detail"
        ],
        "title": "StationActionResult",
        "type": "object"
      },
      "StationCapabilities": {
        "description": "Strictly what the driver can do. Versions, schemas and timings are their\nown fields, because they are facts about the station rather than things it\ncan perform.",
        "properties": {
          "commands": {
            "items": {
              "type": "string"
            },
            "title": "Commands",
            "type": "array"
          },
          "streams": {
            "items": {
              "type": "string"
            },
            "title": "Streams",
            "type": "array"
          }
        },
        "title": "StationCapabilities",
        "type": "object"
      },
      "StationDefaultsOut": {
        "description": "What one station's own configuration says a satellite normally flies on.\n\nNot the live transceiver: that is whatever the previous pass left behind.\nThis is the per-satellite configuration the station applies at AOS by\nitself. For Expedite that is the `.exp` mission file assigned to the satellite.",
        "properties": {
          "applied_at_aos": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Applied At Aos"
          },
          "assigned": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Assigned"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason"
          },
          "satellite_id": {
            "format": "uuid",
            "title": "Satellite Id",
            "type": "string"
          },
          "station_id": {
            "format": "uuid",
            "title": "Station Id",
            "type": "string"
          },
          "supported": {
            "default": false,
            "title": "Supported",
            "type": "boolean"
          },
          "unmapped": {
            "items": {
              "type": "string"
            },
            "title": "Unmapped",
            "type": "array"
          },
          "values": {
            "additionalProperties": true,
            "title": "Values",
            "type": "object"
          }
        },
        "required": [
          "station_id",
          "satellite_id"
        ],
        "title": "StationDefaultsOut",
        "type": "object"
      },
      "StationElements": {
        "description": "What one modem holds, and whether it matches the authoritative record.",
        "properties": {
          "epoch": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Epoch"
          },
          "in_sync": {
            "title": "In Sync",
            "type": "boolean"
          },
          "origin": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Origin"
          },
          "read_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Read At"
          },
          "reason": {
            "$ref": "#/components/schemas/ElementsDriftReason",
            "description": "Why this modem's copy does or does not match the hub's."
          },
          "stale": {
            "default": false,
            "title": "Stale",
            "type": "boolean"
          },
          "station_id": {
            "format": "uuid",
            "title": "Station Id",
            "type": "string"
          },
          "station_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Station Name"
          },
          "status": {
            "$ref": "#/components/schemas/StationStatus"
          },
          "superseded_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Superseded At"
          },
          "tle1": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tle1"
          },
          "tle2": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Tle2"
          }
        },
        "required": [
          "station_id",
          "in_sync",
          "status",
          "reason"
        ],
        "title": "StationElements",
        "type": "object"
      },
      "StationLink": {
        "properties": {
          "assigned": {
            "title": "Assigned",
            "type": "boolean"
          },
          "station_id": {
            "format": "uuid",
            "title": "Station Id",
            "type": "string"
          },
          "station_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Station Name"
          },
          "tracking": {
            "title": "Tracking",
            "type": "boolean"
          }
        },
        "required": [
          "station_id",
          "assigned",
          "tracking"
        ],
        "title": "StationLink",
        "type": "object"
      },
      "StationList": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/StationOut"
            },
            "title": "Items",
            "type": "array"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "title": "StationList",
        "type": "object"
      },
      "StationOut": {
        "properties": {
          "agent_connected_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Agent Connected At"
          },
          "altitude_m": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Altitude M"
          },
          "antenna_capabilities": {
            "additionalProperties": {
              "items": {
                "type": "string"
              },
              "type": "array"
            },
            "title": "Antenna Capabilities",
            "type": "object"
          },
          "capabilities": {
            "$ref": "#/components/schemas/StationCapabilities"
          },
          "client_id": {
            "title": "Client Id",
            "type": "string"
          },
          "company": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Company"
          },
          "driver_version": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Driver Version"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_sync_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Sync At"
          },
          "location_lat": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Location Lat"
          },
          "location_lon": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Location Lon"
          },
          "modem_version": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Modem Version"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "pass_timing": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/PassTiming"
              },
              {
                "type": "null"
              }
            ]
          },
          "recording_retention": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RecordingRetention"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the station deletes its own recordings, and after how many hours. Absent while the station's agent is offline or the modem does not report it. When `at_risk` is true, recordings that are not uploaded within `limit_hours` are lost."
          },
          "status": {
            "$ref": "#/components/schemas/StationStatus"
          },
          "status_reason": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/StationStatusReason"
              },
              {
                "type": "null"
              }
            ]
          },
          "supports_omm": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Supports Omm"
          },
          "telemetry": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "description": "Live readings from the station: antenna pointing, modem round-trip time and site weather. Visible to everyone who can see the station, whoever has the antenna booked. Absent while the station's agent is offline or has not reported yet. Use `status` to judge the station's health; a missing `telemetry` does not mean an outage.",
            "title": "Telemetry"
          },
          "timezone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "IANA zone for the site, e.g. `Europe/Stockholm`, when one is on record. Absent means unknown, and the site's local time is then only estimable from longitude.",
            "title": "Timezone"
          },
          "uptime_seconds": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Uptime Seconds"
          },
          "vendor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vendor"
          }
        },
        "required": [
          "id",
          "client_id",
          "name",
          "status"
        ],
        "title": "StationOut",
        "type": "object"
      },
      "StationReading": {
        "description": "The named reads a caller may ask a station for.\n\nA closed set, and an enum rather than a free string so the whole list is\non the published spec: it used to be discoverable only by asking for a\nreading that does not exist and reading the 404's `details.available`.",
        "enum": [
          "location",
          "system",
          "tle-settings",
          "antenna",
          "antenna-position",
          "radio",
          "mission-config",
          "tracking",
          "passes"
        ],
        "title": "StationReading",
        "type": "string"
      },
      "StationRef": {
        "additionalProperties": false,
        "description": "How a pass, booking or file names the station it belongs to.\n\nThe UUID and the name, and deliberately NOT the agent's `client_id`.\nThat field is a login credential \u2014 it pairs with `secret_hash` on\n`station_agents` \u2014 and publishing it here made every client hold a\ncredential as though it were an address. `GET /stations/{id}` still\ncarries it, once, labelled for what it is.",
        "properties": {
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          }
        },
        "required": [
          "id"
        ],
        "title": "StationRef",
        "type": "object"
      },
      "StationStatus": {
        "description": "Liveness is composite: the agent websocket AND the modem behind it.\n\nFour states rather than a boolean because the three unusable ones call for\nthree different actions, and an operator staring at an empty console needs\nto know which. `status_reason` names the leg that failed.",
        "enum": [
          "offline",
          "connecting",
          "online",
          "leased"
        ],
        "title": "StationStatus",
        "type": "string"
      },
      "StationStatusReason": {
        "enum": [
          "agent_offline",
          "modem_unreachable",
          "awaiting_agent_sync",
          "driver_leased"
        ],
        "title": "StationStatusReason",
        "type": "string"
      },
      "StreamInventory": {
        "additionalProperties": false,
        "properties": {
          "streams": {
            "additionalProperties": {
              "items": {
                "$ref": "#/components/schemas/ChunkMeta"
              },
              "type": "array"
            },
            "title": "Streams",
            "type": "object"
          }
        },
        "required": [
          "streams"
        ],
        "title": "StreamInventory",
        "type": "object"
      },
      "StreamSummary": {
        "additionalProperties": false,
        "properties": {
          "first_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "First At"
          },
          "frames": {
            "title": "Frames",
            "type": "integer"
          },
          "last_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last At"
          },
          "stream": {
            "title": "Stream",
            "type": "string"
          }
        },
        "required": [
          "stream",
          "frames"
        ],
        "title": "StreamSummary",
        "type": "object"
      },
      "SystemStatus": {
        "additionalProperties": false,
        "properties": {
          "agent_protocol_version": {
            "title": "Agent Protocol Version",
            "type": "integer"
          },
          "now": {
            "format": "date-time",
            "title": "Now",
            "type": "string"
          },
          "passes_in_progress": {
            "title": "Passes In Progress",
            "type": "integer"
          },
          "passes_upcoming_24h": {
            "title": "Passes Upcoming 24H",
            "type": "integer"
          },
          "services": {
            "items": {
              "$ref": "#/components/schemas/ServiceHealth"
            },
            "title": "Services",
            "type": "array"
          },
          "stations_online": {
            "title": "Stations Online",
            "type": "integer"
          },
          "stations_total": {
            "title": "Stations Total",
            "type": "integer"
          }
        },
        "required": [
          "now",
          "stations_total",
          "stations_online",
          "passes_in_progress",
          "passes_upcoming_24h",
          "agent_protocol_version",
          "services"
        ],
        "title": "SystemStatus",
        "type": "object"
      },
      "TemplateList": {
        "additionalProperties": false,
        "properties": {
          "editable_fields": {
            "items": {
              "type": "string"
            },
            "title": "Editable Fields",
            "type": "array"
          },
          "fields_advertised": {
            "default": false,
            "title": "Fields Advertised",
            "type": "boolean"
          },
          "items": {
            "items": {
              "$ref": "#/components/schemas/TemplateOut"
            },
            "title": "Items",
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "title": "TemplateList",
        "type": "object"
      },
      "TemplateOut": {
        "additionalProperties": false,
        "description": "A named template, and its section at each station it was authored for.\n\nThe template itself carries no config. It used to, plus a binding table\nsaying where to apply it. A configuration written against no station in\nparticular, which is how a field one site has and another does not could\nbe typed in and silently dropped at the second.",
        "properties": {
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "organization_id": {
            "format": "uuid",
            "title": "Organization Id",
            "type": "string"
          },
          "sections": {
            "items": {
              "$ref": "#/components/schemas/SectionOut"
            },
            "title": "Sections",
            "type": "array"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "organization_id",
          "updated_at"
        ],
        "title": "TemplateOut",
        "type": "object"
      },
      "TleOut": {
        "properties": {
          "name": {
            "title": "Name",
            "type": "string"
          },
          "norad_id": {
            "title": "Norad Id",
            "type": "string"
          },
          "omm": {
            "additionalProperties": true,
            "title": "Omm",
            "type": "object"
          },
          "operator_set": {
            "default": false,
            "title": "Operator Set",
            "type": "boolean"
          },
          "satellite_id": {
            "format": "uuid",
            "title": "Satellite Id",
            "type": "string"
          },
          "tle1": {
            "title": "Tle1",
            "type": "string"
          },
          "tle2": {
            "title": "Tle2",
            "type": "string"
          },
          "updated_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Updated At"
          }
        },
        "required": [
          "satellite_id",
          "name",
          "tle1",
          "tle2",
          "norad_id"
        ],
        "title": "TleOut",
        "type": "object"
      },
      "TransceiverPatch": {
        "additionalProperties": true,
        "description": "A sparse change to what the modem is doing right now.\n\nOnly the paths present are sent; anything omitted is left alone. The body\nis a NESTED object whose keys are the field paths this station advertises.\nfetch them from `GET /stations/{station_id}/mission-fields`, where each\nitem's `path` is dotted (`telemetry.fec`) and nests here\n(`{\"telemetry\": {\"fec\": ...}}`).\n\nWhich paths exist is per-station and per-firmware, so there is no fixed\nschema and none is published. A station that has never described itself\nfalls back to a generic list (`rxdsp`, `txdsp`, and `packet` / `data` /\n`fec` / `scrambler` under both `telemetry` and `command`, plus `plop` under\n`command`), and `mission-fields` reports `advertised: false` when that is\nwhat you are being offered.\n\nTwo things will refuse the whole call rather than apply part of it: a path\nthis station does not have, and a path your organization is not permitted\nto set. Both come back as `403 mission_field_not_permitted` with the\noffending paths in `details.rejected`. Nothing is written when any field\nfails. `GET /stations/{station_id}/mission-fields` is the authority on\nwhich paths you may send; a path missing from it is one of these two.\n\nRequires an ACTIVE pass on this station: this drives a radio mid-contact,\nand outside a pass it answers `409 station_not_permitted`.",
        "example": {
          "rxdsp": {
            "frequency_hz": 2245000000
          },
          "telemetry": {
            "fec": "RS_255_223",
            "scrambler": "CCSDS"
          }
        },
        "properties": {},
        "title": "TransceiverPatch",
        "type": "object"
      },
      "Unavailable": {
        "additionalProperties": false,
        "description": "Somebody else holds the station.\n\nFor a caller who may NOT be told whose booking it is, that is the whole\nmessage: the slot is taken and nothing more.\n\n`held_by`, `held_by_satellite` and `held_by_booking_id` are filled only\nwhen the caller may already see the booking in the way, which for most\ncallers means one of their own. Use them to tell \"your own session on the\nnext satellite along has the dish\" apart from a slot held by somebody you\nare not being told about; the generic `reason` is all you get for the\nlatter.",
        "properties": {
          "held_by": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Person"
              },
              {
                "type": "null"
              }
            ]
          },
          "held_by_booking_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Held By Booking Id"
          },
          "held_by_satellite": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/app__domains__passes__schemas__SatelliteRef"
              },
              {
                "type": "null"
              }
            ]
          },
          "reason": {
            "$ref": "#/components/schemas/UnavailableReason"
          },
          "status": {
            "const": "unavailable",
            "default": "unavailable",
            "title": "Status",
            "type": "string"
          }
        },
        "required": [
          "reason"
        ],
        "title": "Unavailable",
        "type": "object"
      },
      "UnavailableReason": {
        "enum": [
          "booked_by_other_org",
          "antenna_busy",
          "booked_externally",
          "turnaround",
          "claimed_by_other_org"
        ],
        "title": "UnavailableReason",
        "type": "string"
      },
      "UnbookOutcome": {
        "description": "Per-pass result of `POST /passes/unbook`.\n\nSwitch on this, not on the HTTP status. The batch is always `207`.\n\n`unbooked` released the slot. `not_booked` means nothing was holding it.\n`station_refused` means the station would not let it go and **the booking\nstill stands**: the slot is deliberately not freed while the modem is\nstill committed to it. `ambiguous` is a continuously visible satellite\nholding more than one live session, where naming the pass does not say\nwhich to release: cancel it by booking id instead. `not_found`,\n`permission_denied` and `error` are what they say.",
        "enum": [
          "unbooked",
          "station_refused",
          "not_booked",
          "ambiguous",
          "not_found",
          "permission_denied",
          "error"
        ],
        "title": "UnbookOutcome",
        "type": "string"
      },
      "UnbookReport": {
        "additionalProperties": false,
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/UnbookResult"
            },
            "title": "Items",
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "title": "UnbookReport",
        "type": "object"
      },
      "UnbookRequest": {
        "additionalProperties": false,
        "example": {
          "pass_ids": [
            "0f4f2b8c-1d2e-4a3b-9c8d-7e6f5a4b3c2d",
            "6a1c9e40-5b77-4e21-8f0a-2d3c4b5a6978"
          ]
        },
        "properties": {
          "pass_ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 100,
            "minItems": 1,
            "title": "Pass Ids",
            "type": "array"
          }
        },
        "required": [
          "pass_ids"
        ],
        "title": "UnbookRequest",
        "type": "object"
      },
      "UnbookResult": {
        "additionalProperties": false,
        "properties": {
          "booking_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Booking Id"
          },
          "message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Message"
          },
          "pass_id": {
            "format": "uuid",
            "title": "Pass Id",
            "type": "string"
          },
          "result": {
            "$ref": "#/components/schemas/UnbookOutcome"
          },
          "status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/CancelDisposition"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "pass_id",
          "result"
        ],
        "title": "UnbookResult",
        "type": "object"
      },
      "UpdateSatelliteRequest": {
        "additionalProperties": false,
        "description": "Editing a satellite your organization owns, whatever its origin.\n\nEvery field is optional and absence means \"leave it\": a client that sends\n`{\"description\": \"...\"}` must not blank the contact it never mentioned.\n`None` is therefore not \"clear this\": use an empty string for that, which\nthe validators below turn back into NULL.\n\n`name` is the one field with a station behind it. Expedite keys `/track/*`\non the exact string, so renaming means re-registering the satellite at\nevery station that tracks it. See `catalog.rename`.",
        "example": {
          "contact_email": "ops@example.org",
          "description": "S-band technology demonstrator. Phase 2."
        },
        "properties": {
          "contact_email": {
            "anyOf": [
              {
                "maxLength": 320,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Contact Email"
          },
          "contact_name": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Contact Name"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 4000,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          }
        },
        "title": "UpdateSatelliteRequest",
        "type": "object"
      },
      "UpdateTemplateRequest": {
        "additionalProperties": false,
        "example": {
          "name": "S-band downlink (high rate)",
          "sections": {
            "3c7f1a90-2e64-4b13-9d05-8a1f6c2b7e44": {
              "config": {
                "telemetry": {
                  "fec": "RS_255_223"
                }
              }
            }
          }
        },
        "properties": {
          "default_at_station_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Default At Station Id"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "sections": {
            "anyOf": [
              {
                "additionalProperties": {
                  "$ref": "#/components/schemas/SectionRequest"
                },
                "propertyNames": {
                  "format": "uuid"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sections"
          }
        },
        "title": "UpdateTemplateRequest",
        "type": "object"
      },
      "WriteReportOut": {
        "description": "The whole answer to a config write. Never a silent partial apply.\n\nA 200 that quietly dropped half a config is what forced every client to\nread the modem back to find out what took.",
        "properties": {
          "applied": {
            "items": {
              "type": "string"
            },
            "title": "Applied",
            "type": "array"
          },
          "cleared": {
            "items": {
              "type": "string"
            },
            "title": "Cleared",
            "type": "array"
          },
          "coerced": {
            "items": {
              "$ref": "#/components/schemas/FieldVerdictOut"
            },
            "title": "Coerced",
            "type": "array"
          },
          "dry_run": {
            "default": false,
            "title": "Dry Run",
            "type": "boolean"
          },
          "inapplicable": {
            "items": {
              "$ref": "#/components/schemas/FieldVerdictOut"
            },
            "title": "Inapplicable",
            "type": "array"
          },
          "missing_required": {
            "items": {
              "type": "string"
            },
            "title": "Missing Required",
            "type": "array"
          },
          "rejected": {
            "items": {
              "$ref": "#/components/schemas/FieldVerdictOut"
            },
            "title": "Rejected",
            "type": "array"
          }
        },
        "title": "WriteReportOut",
        "type": "object"
      },
      "app__domains__files__schemas__SatelliteRef": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "norad_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Norad Id"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "SatelliteRef",
        "type": "object"
      },
      "app__domains__passes__schemas__SatelliteRef": {
        "additionalProperties": false,
        "description": "How a pass or booking names its satellite.\n\nFor a live satellite this is read off the satellites row. For one that has\nbeen DELETED it is read off the booking's own snapshot (`0044`), which is\nwhy `id` here may name a row that no longer exists. A past pass has to be\nable to say what it flew.",
        "properties": {
          "deleted": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Deleted"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "norad_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Norad Id"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "title": "SatelliteRef",
        "type": "object"
      }
    },
    "securitySchemes": {
      "bearerAuth": {
        "bearerFormat": "JWT",
        "description": "An OAuth2 `client_credentials` access token, without the `Bearer ` prefix.\n\nExchange your organization's `api_client_id` and client secret at the realm token endpoint. See `oauth2` below for the URL, and `GET /api/v1/me/organization` for your client id. There are no token scopes: what a caller may do is decided by the grants its organization holds, not by a claim in the token.",
        "scheme": "bearer",
        "type": "http"
      },
      "oauth2": {
        "description": "Client-credentials flow against the Umoja realm. Scopes are deliberately empty: authority comes from the organization's grants.",
        "flows": {
          "clientCredentials": {
            "scopes": {},
            "tokenUrl": "http://keycloak.invalid/realms/umoja/protocol/openid-connect/token"
          }
        },
        "type": "oauth2"
      }
    }
  },
  "info": {
    "contact": {
      "email": "support@remosspace.com",
      "name": "Remos Space Systems"
    },
    "description": "The Umoja hub: book passes on ground stations, configure what the modem does\nduring them, and collect what comes back.\n\n## Getting a token\n\nEvery call carries an OAuth2 `client_credentials` access token as\n`Authorization: Bearer <token>`.\n\n**Your first credential is issued out of band.** When Remos provisions your\norganization you are given a client id and a client secret; there is no public\nendpoint that mints them, because you would need a token to call it. Start\nthere:\n\n1. Exchange the client id and secret for a token at the realm token endpoint.\n   `securitySchemes.oauth2` carries the URL, and the grant is\n   `client_credentials`.\n2. With that token, `GET /api/v1/me/organization` confirms which organization\n   it acts for and echoes the `api_client_id` you just used.\n3. To roll the secret later, `POST /api/v1/me/organization/rotate` returns a\n   new one. It is **shown once**, and the previous secret stops working the\n   moment it is issued, so update your integrations before you call it.\n\n`POST /api/v1/me/organization/token` is a convenience for a signed-in operator\nin the portal: it mints an organization token without you handling the secret.\nAn integration should use the token endpoint directly.\n\nThere are no token scopes. What a caller may do is decided by the grants its\norganization holds over each station, satellite and mission field, so two\ntokens from the same realm can have entirely different reach. The answer\nchanges when your grants change rather than when you mint a new token. Ask\nRemos to widen a grant; minting a fresh token will not.\n\n## Every response has the same envelope\n\n```json\n{\"status\": \"ok\", \"message\": \"...\", \"data\": {...},\n \"request_id\": \"9f0c...\", \"timestamp\": 1790000000000}\n```\n\n`data` holds the payload. `timestamp` is Unix epoch MILLISECONDS. Quote\n`request_id` when reporting a problem. It appears in the hub's logs and in the\n`X-Request-ID` response header.\n\nFailures use the same envelope with `status: \"error\"` and an `ErrorPayload` in\n`data`. **Branch on `error_code`, never on `message`**: the code is the\ncontract, the message is prose that may be reworded. The full set of codes is\nthe `ErrorCode` enum in the schemas.\n\n## Things that will surprise you\n\n* **404 does not mean \"absent\".** A resource another organization owns is\n  indistinguishable from one that does not exist, deliberately, so an id\n  cannot be probed. Where the hub can safely say more, it returns 403.\n* **Batch booking answers 207, not 409.** `POST /api/v1/passes/book` returns a\n  row per requested pass; one conflict does not cost you the rest. Check each\n  row's `result`, and note that `pending_sync` means the pass IS reserved,\n  held for a station that was offline and reconciled when it reconnects. Treating\n  only `booked` as success will make you double-book.\n* **Nullable fields are absent, not null.** Responses are serialised with\n  `exclude_none`, so an optional field you were not given is missing from the\n  object rather than present as `null`.\n* **A `pass_id` is a handle on an offer; a `booking_id` is yours to keep.**\n  A pass keeps its id across re-predictions, but a pass the station stops\n  listing and lists again, or one whose window moves by more than its own\n  length, comes back under a new id. List passes, then book. Store the\n  `booking_id` you get back and address everything after that by it:\n  `/api/v1/bookings/{booking_id}` for status and mission parameters, and\n  `POST /api/v1/passes/unbook`, whose `pass_ids` accepts a booking id, to\n  cancel. The `pass_id` on a booking follows the pass it now matches, so a\n  stored copy can go stale.\n* **Mission parameters lock before AOS.** Editing them after the hub has\n  pushed the configuration to the station returns `409 pass_locked` with\n  `details.locks_at`.\n\n## Idempotency and rate limits\n\nSend `Idempotency-Key` on any write you may retry; a replayed key returns the\noriginal response with `Idempotent-Replay: true`. Exceeding the rate limit\nreturns `429` with `Retry-After` in seconds.\n\n---\n\n## Operating a satellite end to end\n\nThis walks one satellite through a full cycle: keeping its orbit current,\nfinding and reserving a pass, configuring the radio for it, and giving the\nslot back if plans change. Each step is a couple of calls. The order matters\nmore than the individual requests.\n\nEverything here is scoped to the organisation your token names. Call\n`GET /me` first if you are not sure which that is.\n\n### Keep the orbit current\n\nUmoja steers every station from an element set. By default that comes from the\nmirrored CelesTrak catalog, refreshed by the hub. If you operate the\nsatellite you can override it at any time.\n\nRead what the hub currently holds:\n\n```http\nGET /api/v1/satellites/{satellite_id}/tle\n```\n\n```json\n{\n  \"status\": \"ok\",\n  \"data\": {\n    \"satellite_id\": \"9b1f...\",\n    \"name\": \"AURORA-1\",\n    \"norad_id\": \"55042\",\n    \"tle1\": \"1 55042U 23001A   26264.17538...\",\n    \"tle2\": \"2 55042  97.4501 210.3312 ...\",\n    \"omm\": { \"OBJECT_NAME\": \"AURORA-1\", \"EPOCH\": \"2026-09-20T04:12:33.120576\", \"...\": \"...\" },\n    \"operator_set\": false,\n    \"updated_at\": \"2026-09-20T06:00:11Z\"\n  }\n}\n```\n\n`operator_set` is the field to read. False means the satellite is following the\npublic catalog. True means somebody replaced it here.\n\nTo update, send **either** an OMM record **or** two TLE lines. Not both, not\nneither:\n\n```http\nPUT /api/v1/satellites/{satellite_id}/tle\nContent-Type: application/json\n\n{\n  \"omm\": {\n    \"OBJECT_NAME\": \"AURORA-1\",\n    \"NORAD_CAT_ID\": 55042,\n    \"EPOCH\": \"2026-09-21T11:37:02.000000\",\n    \"MEAN_MOTION\": 15.19472182,\n    \"ECCENTRICITY\": 0.0011733,\n    \"INCLINATION\": 97.4501,\n    \"RA_OF_ASC_NODE\": 210.3312,\n    \"ARG_OF_PERICENTER\": 88.1204,\n    \"MEAN_ANOMALY\": 272.0417,\n    \"BSTAR\": 0.00012345\n  }\n}\n```\n\nPrefer OMM if you have one. Rendering it to two lines and parsing them back\ndrops every field a TLE has no column for.\n\nDo not send a name in the body. The hub fills it from the satellite's own\nname when it dispatches to a station, because a station catalogs by name and a\nmismatch creates a second entry there instead of updating the first.\n\nThe record has to be SGP4 compatible. Umoja serves every station TLE lines\nrendered from it, so elements a different propagator reads would be\npropagated as though they were SGP4, which is wrong pointing rather than a\nclean refusal. A non-SGP4 `MEAN_ELEMENT_THEORY` is rejected, as is a record\nmissing the mandatory elements.\n\nWriting elements requires **ownership** of the satellite, not just access to\nit. Access lets you book passes and read the orbit. Ownership lets you change\nit. Without it you get 403.\n\n#### Confirm it took, at the hub and at the stations\n\nRead `GET /satellites/{satellite_id}/tle` back and check `operator_set` is now\ntrue and `updated_at` moved. That confirms the hub.\n\nThe stations are a separate question, and this is the step people skip. A\nstation predicts its own passes from the elements it holds, so one carrying an\nolder set points its antenna on its own answer. `PUT .../tle` does not push to\nanything.\n\n```http\nGET /api/v1/satellites/{satellite_id}/elements\n```\n\n```json\n{\n  \"status\": \"ok\",\n  \"data\": {\n    \"drift\": true,\n    \"stations\": [\n      {\n        \"station_id\": \"930793e4-f9d4-41ef-9750-f9a63d8ad439\",\n        \"station_name\": \"DIT-1\",\n        \"epoch\": \"2026-09-18T02:11:44Z\",\n        \"in_sync\": false,\n        \"reason\": \"stale_online_update\",\n        \"read_at\": \"2026-09-21T09:02:00Z\",\n        \"stale\": false,\n        \"status\": \"online\"\n      }\n    ]\n  }\n}\n```\n\n`drift: true` means at least one assigned station disagrees. `read_at` is\nabsent when a modem has never been asked, which `reason: not_read` also says.\n\nConvergence is never automatic. Re-read the modems with\n`POST /satellites/{satellite_id}/elements/refresh`, which changes nothing, and\npush with `POST /satellites/{satellite_id}/elements/push`, which writes the\nhub's elements to every assigned station. Both answer with one result row per\nstation, each with its own `ok` and `detail`, so an offline station fails its\nown row without failing the others.\n\n### Find passes\n\nOne endpoint answers both \"what is scheduled\" and \"what is free\", because the\navailability is already resolved onto each row. There is no separate\nfree-slots call.\n\n```http\nGET /api/v1/passes?satellite_id=AURORA-1&from=2026-09-22T00:00:00Z&to=2026-09-23T00:00:00Z\n```\n\nEach item carries `availability.status`, which is one of:\n\n`open`, meaning bookable now.\n\n`booked`, meaning reserved. Whose reservation it is, is only disclosed if it\nis your organisation's.\n\n`unavailable`, with a reason: another organisation holds it, the antenna is\nbusy on a different pass, somebody drove the station directly, an adjacent\nbooking's turnaround covers it, or a claim from a pass that was stopped part\nway.\n\nFilter to what you want with these:\n\nScheduled passes, all of them: `?scope=org`. Just yours: `?scope=me`.\nEverything reachable, booked or not: `?scope=any`, which is the default.\n\nAvailable slots only: `?status=open`.\n\nOne ground station: `?station_id=<station-uuid>`. The parameter is repeatable\nand takes the station's UUID; a client id resolves to no station and would\nreturn an empty page.\n\nA single pass: `GET /api/v1/passes/{pass_id}`, which adds the reservation and\nits realtime window when you may see them.\n\nPaging is by opaque cursor. Send `next_cursor` back as `cursor`; a response\nwithout one is the last page. A reversed range, `from` after `to`, is a 400\nrather than an empty page.\n\n### Reserve\n\n```http\nPOST /api/v1/passes/book\nContent-Type: application/json\n\n{ \"pass_ids\": [\"0f4f2b8c-1d2e-4a3b-9c8d-7e6f5a4b3c2d\"] }\n```\n\nThe response is **always** `207`, even for one id and even when everything\nsucceeded. Read `items`, not the status code:\n\n```json\n{\n  \"status\": \"ok\",\n  \"data\": {\n    \"items\": [\n      {\n        \"pass_id\": \"0f4f2b8c-...\",\n        \"result\": \"booked\",\n        \"booking_id\": \"45d5fbb6-...\",\n        \"starts_at\": \"2026-09-22T09:14:02Z\",\n        \"ends_at\": \"2026-09-22T09:25:31Z\"\n      }\n    ]\n  }\n}\n```\n\n`booked` and `pending_sync` both hold the slot. The second means the station\nwas unreachable and the hub reserved it anyway; the reconnect reconciler\npushes it when the station returns. Everything else reserved nothing. The\nvalues you will actually hit are `conflict`, `already_booked` and\n`station_refused`.\n\nTwo of the refusals are about windows and are worth understanding once. A\nsatellite that rises and sets already has a predicted window, so sending your\nown `session` gets `window_not_allowed`. A continuously visible satellite has\nno window of its own and must carry one, so omitting it gets\n`window_required`.\n\nKeep the `booking_id`. Everything from here on is addressed by it.\n\nYou can book and configure in one call by including `mission_config` in the\nbook request, which saves both in the same transaction. Useful when a pass is\nclose and you do not want the configuration to land after the prepass push.\n\n### Configure the radio\n\nRead what the pass will fly with:\n\n```http\nGET /api/v1/bookings/{booking_id}/mission-params\n```\n\nThe response has four parts and they answer different questions.\n\n`config` plus the named fields are this pass's own overrides, and only what\nwas set here.\n\n`resolved` is what will actually be sent, after the satellite default and the\nstation binding are merged underneath those overrides. Read this to know what\nthe modem gets. `resolved_from` names the layers it came from.\n\n`editable_fields` is which paths you may set at this station. The catalog is\nper station and per policy, so it is not the same list everywhere.\n\n`editable`, `locks_at` and `lock_reason` say whether it can still change.\n\nWrite with a PATCH. Sending `config` **replaces** this pass's configuration\nwholesale; anything previously set and not sent again is cleared, and\n`report.cleared` lists exactly what that removed. The named fields are\nindividual, so omitting one leaves it alone.\n\n```http\nPATCH /api/v1/bookings/{booking_id}/mission-params\nContent-Type: application/json\n\n{\n  \"config\": {\n    \"telemetry\": { \"fec\": \"RS_255_223\", \"scrambler\": \"CCSDS\" },\n    \"rxdsp\": { \"frequency_hz\": 2245000000 }\n  },\n  \"downlink_bitrate_bps\": 9600\n}\n```\n\nNothing is written unless every field is permitted. A field you may not set at\nthat station fails the whole request with 403 and\n`error_code: mission_field_not_permitted`, carrying the per-field report. A\nhalf-applied configuration would be worse than a refusal.\n\nAdd `?dry_run=true` to run every check and write nothing. The response is the\nsame shape, report included, so you can show what a save would do before\noffering it.\n\n#### The lock\n\nConfiguration is editable until the scheduler pushes it to the station ahead\nof the contact. After that a write is `409` with `error_code: pass_locked` and\n`details.locks_at` telling you when that happened. There is no override: the\nstation is already staged for the contact, and the only way to change anything\nis live on the station through\n`PATCH /api/v1/stations/{station_id}/transceiver`, which needs an active pass\nyou hold.\n\nSo the working order is: book, configure, then let the lock fall. If you are\nscripting this, do the PATCH immediately after the book rather than close to\nAOS.\n\nRecording has its own route because it is toggled separately:\n\n```http\nPATCH /api/v1/bookings/{booking_id}/recorder\n{ \"enabled\": true }\n```\n\n`null` removes the override and returns the pass to the satellite's\norganisation-wide default, which is not the same as `false`. Set that default\nwith `PUT /api/v1/satellites/{satellite_id}/recording-default`.\n\n### Give the slot back\n\n```http\nPOST /api/v1/passes/unbook\nContent-Type: application/json\n\n{ \"pass_ids\": [\"0f4f2b8c-1d2e-4a3b-9c8d-7e6f5a4b3c2d\"] }\n```\n\nAlso always `207`, one row per id. Accepts pass ids or booking ids.\n\n`unbooked` released it. `not_booked` means nothing was holding it.\n`station_refused` means the station would not let go and the booking still\nstands, which is deliberate: the slot is not freed while the modem is still\ncommitted to it. `ambiguous` means a continuously visible satellite is holding\nmore than one live session and naming the pass does not say which to release,\nso cancel that one by booking id.\n\nCancelling a pass that is already running stops it. The station stands down,\nthe record is trimmed to what actually flew, and the unused remainder of the\nwindow goes back on the market.\n\n### After the pass\n\nThe recording is addressed by booking id, not pass id. See the\n[Replaying a pass](./replays) guide.\n\n\n---\n\n## Realtime & Data Integration\n\nThree ways to get pass data out of Umoja programmatically:\n\n1. **`portal-link`**: a small client that exposes the live pass as local TCP\n   ports for a Mission Control System (Yamcs, COSMOS/OpenC3, Gpredict, scripts).\n2. **The realtime WebSocket**: `/ws/realtime`, the same live feed the portal\n   itself consumes.\n3. **The mission-data API**: list and download recordings after a pass.\n\nAll three sign in with your Umoja account or your organisation's API client\nand show only your organisation's passes, the same as the portal.\n\n### portal-link (TCP bridge)\n\n`portal-link` opens local TCP ports on your machine so an MCS can exchange\ntelemetry and telecommands with the hub during a pass. It speaks the hub's TCP\nbridge protocol and handles sign-in for you.\n\n#### Quick start\n\nYou need your station id, your organisation's API client id (`api-<company>`)\nand its secret. In the `portal-link/` directory:\n\n```bash\ncp .env.example .env      # fill in PORTAL_LINK_STATION, PORTAL_LINK_CLIENT_ID, PORTAL_LINK_CLIENT_SECRET\ndocker compose up -d --build\ndocker compose logs -f\n```\n\nOr with the binary for your platform:\n\n```bash\n./portal-link --env-file .env\n```\n\nportal-link opens the stream ports on `localhost`, watches the station's\nbookings, connects to the hub 4.5 minutes before each pass and keeps running\nuntil stopped. Point your MCS at `localhost:10025` (TM) and `localhost:10026`\n(TC). Run `./portal-link -h` for all flags; see the `portal-link/README.md`\nfor MCS configuration examples.\n\n#### Streams and ports\n\nEach requested stream is exposed on its own local TCP port. Multiple tools may\nconnect to the same port at once. Every connection gets a copy of the stream.\n\n| Stream | Default port | Direction | Purpose |\n|--------|--------------|-----------|---------|\n| `tm` | 10025 | hub \u2192 MCS | Telemetry frames from the satellite. |\n| `tc` | 10026 | MCS \u2192 hub | Telecommand frames to the satellite. |\n| `doppler` | 10027 | hub \u2192 MCS | Doppler shift updates during the pass. |\n| `ephemeris` | 10028 | hub \u2192 MCS | Predicted trajectory for the pass. |\n| `antenna` | 10029 | hub \u2192 MCS | Antenna pointing telemetry (az/el). |\n| `command` | 10030 | hub \u2192 MCS | Echo of telecommands as they leave the radio. |\n\nRequest more than the default `tm,tc` by listing them:\n\n```bash\n./portal-link \\\n  --hub bridge.umoja.remosspace.com:10100 \\\n  --station <your-station-id> \\\n  --kc-url https://umoja.remosspace.com/login/realms/umoja \\\n  --streams tm,tc,antenna,doppler,ephemeris,command\n```\n\n#### MCS configuration examples\n\n##### Yamcs\n\n```yaml\ndataLinks:\n  - name: remos-tm\n    class: org.yamcs.tctm.TcpTmDataLink\n    host: localhost\n    port: 10025\n    stream: tm_realtime\n  - name: remos-tc\n    class: org.yamcs.tctm.TcpTcDataLink\n    host: localhost\n    port: 10026\n    stream: tc_realtime\n```\n\n##### COSMOS (OpenC3)\n\n```ruby\nINTERFACE REMOS_TM_INT tcpip_client_interface.rb localhost 10025 10025 10.0 nil\nINTERFACE REMOS_TC_INT tcpip_client_interface.rb localhost 10026 10026 10.0 nil\n```\n\n##### Custom script (Python)\n\n```python\nimport socket\n\n# Receive TM\nsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\nsock.connect((\"localhost\", 10025))\nwhile True:\n    data = sock.recv(4096)\n    if not data:\n        break\n    process_telemetry(data)\n```\n\n```python\n# Send TC\nsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\nsock.connect((\"localhost\", 10026))\nsock.sendall(bytes.fromhex(\"A1B2C3D4\"))\n```\n\n### Realtime WebSocket\n\nIf you'd rather consume the feed directly (the same one the portal uses), open\na WebSocket per stream:\n\n```\nwss://<host>/ws/realtime?station_id=<station-uuid>&stream=<stream>[&booking_id=<uuid>]\n```\n\nAuthenticate by sending your Keycloak bearer token as a WebSocket subprotocol:\n\n```js\nnew WebSocket(url, [\"bearer\", \"<your-jwt>\"])\n```\n\nAvailable streams: `spectrum`, `constellation`, `doppler`, `ephemeris`,\n`antenna`, `telemetry`, `command`.\n\nFrames are binary, prefixed with a small header: a 2-byte magic (`EX`), a\n1-byte stream tag, and the 16-byte station client ID (NUL-padded), followed by\nthe stream payload (e.g. spectrum is 1024 \u00d7 `[freq, power]` float32 pairs). The\nhub refreshes nothing for you: keep your token fresh and reconnect on drop.\n\n### Mission-data API\n\nAfter a pass, list and download its recordings over REST. Send your Keycloak\ntoken as `Authorization: Bearer <jwt>`.\n\n| Endpoint | Method | Purpose |\n|----------|--------|---------|\n| `/api/data/files` | GET | List files (filter by `station_id`, `booking_id`, `status`, `from_ts`/`to_ts`, `search`; `group_by_pass`). |\n| `/api/data/files/summary` | GET | Aggregate counts and bytes. |\n| `/api/data/files/{file_id}/link` | POST | Mint a short-lived signed download URL for one file. |\n| `/api/data/bookings/{booking_id}/link` | POST | Mint a signed URL for the whole pass as a ZIP bundle. |\n\nMinting a link, then downloading, keeps the long-lived token off the wire:\n\n```bash\n# 1. mint a signed URL (bearer token)\ncurl -X POST https://umoja.remosspace.com/api/data/files/$FILE_ID/link \\\n  -H \"Authorization: Bearer $TOKEN\"\n# -> { \"download_url\": \"...\", \"expires_in\": 900 }\n\n# 2. download (the signed URL carries its own token)\ncurl -L -o capture.iq \"<download_url>\"\n```\n\nSee the **REST API** tab for the full, interactive reference.\n\n### Recorded pass data (replay)\n\nEvery completed pass is recorded, and the same data Umoja's replay view renders\nis available over `/api/v1` so you can pull it into your own MCS and build your\nown visualization. You only ever see your own organisation's passes. Send\n`Authorization: Bearer <jwt>`.\n\nTwo data classes are recorded:\n\n- TT&C frames (telemetry and command) are the raw wire frames as relayed\n  during the pass, returned base64 in JSON.\n- Graph streams (spectrum, constellation, antenna, doppler, ephemeris) are the\n  demodulated graph frames the live console renders, archived as binary chunks.\n  They are **not raw IQ**. Umoja archives per-frame demodulated products (FFT\n  bins, IQ constellation points, az/el), rate-capped at 5 fps.\n\nStart with the **manifest**, which inventories everything recorded for a pass:\n\n```bash\n# `pass_id` is the pass UUID from the bookings endpoints.\ncurl https://umoja.remosspace.com/api/v1/passes/$PASS_ID/replay \\\n  -H \"Authorization: Bearer $TOKEN\"\n```\n\n| Endpoint | Purpose |\n|----------|---------|\n| `GET /api/v1/passes/{id}/replay` | Discovery manifest: TT&C counts, per-stream chunk inventory, endpoints, `tle_url`, and a self-describing `formats` block. |\n| `GET /api/v1/passes/{id}/ttc?after=&limit=` | TT&C frames, cursor-paginated (page until `next_after` is `null`). |\n| `GET /api/v1/passes/{id}/streams` | List archived graph-stream chunks per stream. |\n| `GET /api/v1/passes/{id}/streams/{stream}/{chunk}` | One chunk as `application/octet-stream` (raw binary, no JSON envelope). |\n| `GET /api/v1/satellites/{satellite_id}/tle` | The pass's TLE, to compute the predicted track yourself (SGP4). |\n\nA pass that has not flown yet has no archive. The endpoints return empty\npayloads for it rather than `404`.\n\n#### Decoding the binary streams\n\nEach stream chunk is a sequence of records, back to back:\n\n```\n[ capture_ms : u64 big-endian ][ payload_len : u32 big-endian ][ payload : payload_len bytes ]\n```\n\n`capture_ms` is the Unix epoch millisecond of capture. Read the 12-byte header,\nthen `payload_len` payload bytes, repeat to end of chunk. Payloads (multi-byte\nnumbers little-endian unless noted):\n\n| Stream | Payload |\n|--------|---------|\n| `spectrum` | 1024 bins \u00d7 `[frequency_hz: f32][power: f32]` (8 bytes/bin, 8192 bytes/frame). |\n| `constellation` | 1024 samples \u00d7 `[I: f32][Q: f32]`. Demodulated constellation points, not raw IQ. |\n| `antenna` | Az/el frame: JSON `{\"azimuth\": deg, \"elevation\": deg}`, or an Expedite binary frame (\u226536 bytes) with `azimuth = f32` at byte 28, `elevation = f32` at byte 32. |\n| `doppler`, `ephemeris` | Vendor demodulated graph frames. Listed, but the payload layout is experimental. |\n\nTT&C `frame_b64` decodes to the raw wire frame, which you parse with your own\nTM/TC parser. Pre-2026 recordings may carry a 19-byte station envelope (`\"EX\"` =\n`0x45 0x58`, a type byte `0x07`/`0x08`, then a 16-byte client id); strip it if\n`bytes[0..1] == 0x45,0x58`.\n\nThe predicted elevation and ground track are not stored. Fetch the TLE\n(`satellites/{id}/tle`) and propagate it with SGP4, then overlay the `antenna`\nstream for the actual measured track.\n\n### Session window\n\nA live session (portal-link or WebSocket) is tied to a booking and only flows\nduring its window:\n\n- Earliest: **AOS \u2212 5 minutes**. Latest: **LOS**.\n- If you connect before the window opens, the hub answers\n  `AUTH_FAIL:pass_not_started`. Keep retrying and the session opens when the\n  window does. portal-link does this for you.\n- At LOS the hub sends a `pass_ended` event and closes the session.\n\n### Troubleshooting\n\n| Symptom | Cause | What to do |\n|---------|-------|------------|\n| `AUTH_FAIL:invalid_token` | Your token expired or is malformed. | Re-run portal-link or refresh your token. |\n| `AUTH_FAIL:pass_not_started` | Your booking exists, but its window has not opened yet. | Wait. The window opens 5 minutes before AOS, and portal-link keeps retrying until then. |\n| `AUTH_FAIL:pass_ended` | The booking's window has closed, or the pass is already marked as completed. | Nothing more will flow for this booking. Connect to your next pass instead. |\n| `AUTH_FAIL:booking_cancelled` | The booking was cancelled, a cancel is in progress, or the station dropped or refused the pass. | Check the booking's status under **Bookings**. |\n| `AUTH_FAIL:no_such_booking` | The hub found no booking with that id on that station that you can use. | Check the booking id and the station. The hub gives this same answer whether the booking is missing, on another station or belongs to someone else, so it cannot tell you which. |\n| `AUTH_FAIL:unknown_station` | The station does not exist, or your organization has no access to it. | Check the station under **Stations**. |\n| `AUTH_FAIL:invalid_station_id` | The handshake's `station_id` was not a UUID. | portal-link takes it from the booking, so this points to a mismatch between hub and client versions rather than a wrong `--station`. |\n| `AUTH_FAIL:transmit_not_permitted` | You asked for the TC stream, but your organization may not transmit from this station. | Ask Umoja support for the transmit right, or connect without TC. |\n| `AUTH_FAIL:invalid_json`, `missing_fields`, `envelope_too_large` | The handshake envelope was malformed. | Usually a mismatch between hub and client versions. Update portal-link. |\n| `AUTH_FAIL:server_full` | The bridge has too many sessions open. | Retry shortly, or contact support. |\n| `AUTH_FAIL:rate_limited` | Your address failed the handshake too many times in a short period. | Fix whatever made the earlier attempts fail, then wait a few minutes before you retry. |\n| TM stops mid-pass | The network dropped, or the pass reached LOS. | portal-link reconnects on its own until LOS. |\n| TC not delivered | The station is offline. | Check the station's live state under **Stations**. |\n\n\n---\n\n## Orbital Elements (TLE / OMM)\n\nUmoja tracks every satellite from an element set. By default that set comes\nfrom CelesTrak's GP catalog, polled by the hub every six hours in OMM form. If\nyou operate the satellite, you can replace it at any time, before, between or\nduring passes, and Umoja will steer the ground stations on your set.\n\n### Who can set elements\n\nSetting elements requires **ownership** of the satellite, which Remos grants\nalongside booking access. Ask your contact if you need it. Booking access\nalone lets you schedule passes and read the current elements; it does not let\nyou change them (`403 satellite_not_owned`).\n\n`GET /api/v1/satellites/{satellite_id}` answers whether you have it: `owned`\nis true for a satellite your organization owns, and `can_edit` is what to gate\nan edit control on.\n\n### Formats\n\nSend **either** classic TLE lines **or** an OMM object to\n`POST /api/v1/satellites/{satellite_id}/tle`:\n\n```json\n{ \"tle1\": \"1 25544U 98067A   24112.50000000  .00012345  00000-0  22663-3 0  9992\",\n  \"tle2\": \"2 25544  51.6400 123.4567 0008721  21.6789 338.5234 15.49321800123453\" }\n```\n\n```json\n{ \"omm\": {\n    \"NORAD_CAT_ID\": 25544, \"EPOCH\": \"2024-04-21T12:00:00.000000\",\n    \"MEAN_MOTION\": 15.493218, \"ECCENTRICITY\": 0.0008721, \"INCLINATION\": 51.64,\n    \"RA_OF_ASC_NODE\": 123.4567, \"ARG_OF_PERICENTER\": 21.6789, \"MEAN_ANOMALY\": 338.5234,\n    \"BSTAR\": 0.00022663, \"MEAN_MOTION_DOT\": 0.00012345 } }\n```\n\n* **OMM** uses the CCSDS / CelesTrak GP JSON field names (case-insensitive).\n  `NORAD_CAT_ID` is a plain integer, so 6-digit catalog numbers need no special\n  encoding. Optional fields (`OBJECT_NAME`, `OBJECT_ID`, `CLASSIFICATION_TYPE`,\n  `EPHEMERIS_TYPE`, `ELEMENT_SET_NO`, `REV_AT_EPOCH`, `BSTAR`,\n  `MEAN_MOTION_DOT`, `MEAN_MOTION_DDOT`) default sensibly when absent.\n* **TLE** lines must be 69 characters with valid modulo-10 checksums. Catalog\n  numbers above 99999 use **Alpha-5** in columns 3-7 (`A0000` = 100000,\n  `Z9999` = 339999; letters I and O are skipped).\n\nThe catalog number in the element set must match the satellite in the URL.\n\n### What happens when you set elements\n\n1. The hub stores your set and serves it from every read\n   (`GET /api/v1/satellites/{id}/tle` returns `source: \"override\"`, plus the\n   set in both TLE and OMM form). It outranks the CelesTrak feed and survives\n   the feed refresh.\n2. The hub pushes the set into every online ground station that tracks your\n   satellite, so the antenna steers on it from the next pass. The response's\n   `pushed` array reports each station; a station that is offline receives the\n   set automatically when it reconnects.\n\nReading elements never requires ownership. `GET .../tle` needs only booking\naccess and `api:read`.\n\n\n---\n\n## Replaying a pass\n\nEverything a pass produced is addressed by its **booking**, never by the pass.\nThis is the part that trips people up, so it is worth stating plainly before\nanything else: a pass is a prediction, a booking is the reservation that flew\nit, and a pass flown twice has two recordings. If you hold a pass id, resolve\nit to a booking id first with `GET /passes/{pass_id}` and read `booking.id`.\n\nThere are two kinds of recording and they live in different places.\n\nTT&C frames are decoded telemetry and telecommand, stored row by row in the\nhub. You read them through `GET /bookings/{booking_id}/ttc`.\n\nGraph streams are the sampled feeds (antenna pointing, doppler, spectrum and\nso on), stored as binary chunks in object storage. You list them with\n`GET /bookings/{booking_id}/streams` and fetch each chunk individually.\n\nA pass can have one, both, or neither. An empty list is not an error.\n\n### Start with the summary\n\n`GET /bookings/{booking_id}/replay` is an index. It tells you what exists\nbefore you fetch any of it:\n\n```http\nGET /api/v1/bookings/0b8bb813-20be-451d-8df0-cc20809a6da7/replay\nAuthorization: Bearer <token>\n```\n\n```json\n{\n  \"status\": \"ok\",\n  \"data\": {\n    \"booking_id\": \"0b8bb813-20be-451d-8df0-cc20809a6da7\",\n    \"starts_at\": \"2026-09-21T21:29:18Z\",\n    \"ends_at\": \"2026-09-21T21:40:37Z\",\n    \"ttc\": [\n      {\n        \"stream\": \"telemetry\",\n        \"frames\": 119,\n        \"first_at\": \"2026-09-21T21:29:49.396Z\",\n        \"last_at\": \"2026-09-21T21:39:30.192Z\"\n      }\n    ],\n    \"graph_streams\": [\"antenna\", \"constellation\", \"doppler\", \"ephemeris\", \"spectrum\"]\n  }\n}\n```\n\n`ends_at` is null while an open-ended session is still running. Until it is\nreleased there is no end to draw a scrubber against.\n\nIf the booking is not one you can reach, this answers 404 rather than 403.\nWhether somebody else's pass exists is not yours to learn.\n\n### Reading TT&C frames\n\nPaging here is by cursor, not by offset. Take `next_after` from the response\nand send it back as `after`. A response without one is the last page.\n\n```http\nGET /api/v1/bookings/{booking_id}/ttc?after=0&limit=2000\n```\n\n```json\n{\n  \"status\": \"ok\",\n  \"data\": {\n    \"frames\": [\n      {\n        \"id\": 84021,\n        \"stream\": \"telemetry\",\n        \"captured_at\": \"2026-09-21T21:29:49.396Z\",\n        \"frame_b64\": \"GgAAAB4AAAB...\"\n      }\n    ],\n    \"total\": 119,\n    \"next_after\": 84520\n  }\n}\n```\n\nThree things about this response are easy to get wrong.\n\n`total` is sent on the first page only, when you omit `after`. It does not\nchange while a finished pass is read back, so keep the number you were given\ninstead of asking again. Counting frames is the most expensive part of the\nrequest and a pass can hold tens of thousands.\n\n`frame_b64` is the raw frame, base64 encoded. The hub does not parse it. What\nthe bytes mean is your spacecraft's business.\n\n`captured_at` is the modem's own timestamp, not when the hub stored it. Use it\nto place the frame inside the pass. Only frames captured within the recording\nwindow of this booking come back, which matters on a shared dish: a station\nflushes its whole decoded backlog when its agent reattaches, and another\norganisation's contact must not be served here.\n\nNarrow to one stream with `?stream=telemetry` if you only want one side of the\nconversation.\n\n### Reading graph streams\n\n`GET /bookings/{booking_id}/streams` returns the chunk inventory, grouped by\nstream:\n\n```json\n{\n  \"status\": \"ok\",\n  \"data\": {\n    \"streams\": {\n      \"antenna\": [\n        { \"chunk\": \"1790026072167-00000.bin\", \"size_bytes\": 1126, \"start_ms\": 1790026072167 },\n        { \"chunk\": \"1790026093162-00001.bin\", \"size_bytes\": 1126, \"start_ms\": 1790026093162 }\n      ]\n    }\n  }\n}\n```\n\nChunk names sort chronologically, so the listing is the timeline. A player\nscrubbing to a particular moment picks the chunk covering it rather than\npulling the whole pass to show one second of it. The name is\n`{start_ms:013d}-{seq:05d}.bin` and `start_ms` is repeated in the metadata so\nyou never have to parse it.\n\nFetch one with:\n\n```http\nGET /api/v1/bookings/{booking_id}/streams/antenna/1790026072167-00000.bin\n```\n\nThe body is `application/octet-stream`, not JSON. Records repeat until the end\nof the body:\n\n```\n[u64be capture_ms][u32be length][payload of `length` bytes]\n```\n\nDecoding one in Python:\n\n```python\nimport struct\n\ndef records(blob: bytes):\n    offset = 0\n    while offset < len(blob):\n        captured_ms, length = struct.unpack_from(\">QI\", blob, offset)\n        offset += 12\n        yield captured_ms, blob[offset:offset + length]\n        offset += length\n```\n\n### Sharing a recording\n\nTo hand files from a pass to somebody outside Umoja, mint a link:\n\n```http\nPOST /api/v1/bookings/{booking_id}/files/link\nContent-Type: application/json\n\n{ \"expires_seconds\": 3600 }\n```\n\nThe response carries a URL with a signed token in its query string. It needs\nno bearer credential, so treat it as a credential itself: anyone holding the\nURL can download those files until it expires.\n\nThe file set is fixed and signed into the token when you mint it. It is never\n\"whatever the pass holds when the link is opened\", so a file uploaded\nafterwards is not included, and the link can never reach further than you\ncould at the moment you asked. Send `file_ids` to choose a subset. There is no\nrevocation, so keep `expires_seconds` short.\n\n### When a replay is empty\n\nA booking with no TT&C and no chunks usually means the pass recorded nothing,\nnot that something was lost. The common causes are a recorder that was off for\nthat pass, or a station that never had its configuration pushed.\n\nCheck `recorder_enabled` under `resolved` in\n`GET /bookings/{booking_id}/mission-params` to see what the pass was actually\ntold to do. Recording defaults to on unless somebody turned it off for the\nsatellite.",
    "title": "Umoja API",
    "version": "1.0.0"
  },
  "openapi": "3.1.0",
  "paths": {
    "/api/v1/announcements": {
      "get": {
        "description": "Two lists, selected by different rules.\n\n`releases` is the product's change history: what shipped, newest first.\nHistory does not expire, so a release is returned for as long as it is\npublished whatever dates it carries. Capped at the 20 most recent.\n\n`notices` is what is true right now: maintenance windows, degradations,\nanything with a start and an end. A notice appears only inside its\nwindow, and leaves the list by itself when the window closes.\n\n`unseen_release_count` counts EVERY release this caller has not marked\nseen, not just the 20 returned, so it stays right for somebody who has been\naway a long time. `seen` on each item is per caller, and is set by\n`POST /announcements/{id}/seen`.\n\nUnpublished drafts are never returned here. Announcement bodies are\nMarkdown and may reference images by\n`GET /announcements/media/{media_id}`, which needs no authentication.",
        "operationId": "listAnnouncements",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_AnnouncementFeed_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Release history and active notices, with the unseen count.",
        "tags": [
          "Announcements"
        ]
      }
    },
    "/api/v1/announcements/media/{media_id}": {
      "get": {
        "description": "No authentication: an announcement image is public notice content, and\nthe unguessable id is what stands in for a permission check.",
        "operationId": "getAnnouncementMedia",
        "parameters": [
          {
            "in": "path",
            "name": "media_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Media Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "image/gif": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              },
              "image/jpeg": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              },
              "image/png": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              },
              "image/svg+xml": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              },
              "image/webp": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": "The image bytes, in the type it was uploaded as.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "security": [],
        "summary": "An announcement image.",
        "tags": [
          "Announcements"
        ]
      }
    },
    "/api/v1/announcements/{announcement_id}/seen": {
      "post": {
        "description": "Clears this announcement from the caller's unseen count.\n\nPer caller, not global: another user's badge is unaffected. It is idempotent,\nmarking an announcement seen twice is not an error, and the second call\nreturns the same answer as the first. An id that names no announcement is\naccepted silently rather than 404, because the only thing recorded is\nthat this caller has nothing left to read about it.",
        "operationId": "markAnnouncementSeen",
        "parameters": [
          {
            "in": "path",
            "name": "announcement_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Announcement Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_dict_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Record that I have seen this announcement.",
        "tags": [
          "Announcements"
        ]
      }
    },
    "/api/v1/bookings": {
      "get": {
        "description": "Booking-centric, unlike the pass list.\n\n\"What can I book\" and \"what did I book\" are different questions; answering\nthe second by paging the first makes a client filter a calendar to find its\nown reservations.\n\n`since` bounds the far end: rows are ordered oldest-first, so without it a\nclient that wanted the current and upcoming passes had to page an entire\nbooking history to reach them, and one that read only the first page got\nthe oldest reservations it ever made and none of the live ones.",
        "operationId": "listBookings",
        "parameters": [
          {
            "in": "query",
            "name": "include_past",
            "required": false,
            "schema": {
              "default": false,
              "title": "Include Past",
              "type": "boolean"
            }
          },
          {
            "description": "Station UUID.",
            "in": "query",
            "name": "station",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Station UUID.",
              "title": "Station"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 100,
              "maximum": 500,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "since",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Since"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_BookingPage_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "The caller's reservations, with what each pass produced.",
        "tags": [
          "Bookings"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}": {
      "get": {
        "description": "The same shape `/passes/{id}` answers with.\n\nThe two pages show one contact, so the client renders whichever it was\ngiven without reconciling two payloads. See `PassService.get_booking`.",
        "operationId": "getBooking",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_PassDetail_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "One reservation, told as the pass it reserved.",
        "tags": [
          "Bookings"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/activity": {
      "get": {
        "description": "One timeline over three sources: the booking's own history, the\nlifecycle phases the scheduler fired, and the configuration journal.\n\nSeparately they answer \"what state is it in\", \"did the station get\nconfigured\" and \"what was changed\"; an operator asking what happened to a\npass wants all three interleaved.",
        "operationId": "listBookingActivity",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_ActivityList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "What happened to this pass, in order.",
        "tags": [
          "Bookings"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/config-events": {
      "get": {
        "description": "The station is restored after every pass and a live write leaves no\ntrace on it, so this is the only record of what a pass actually ran on.",
        "operationId": "listBookingConfigEvents",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_ConfigEventList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Every configuration change for this pass, in order.",
        "tags": [
          "Bookings"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/config-events/seen": {
      "put": {
        "description": "Stamp \"I have looked at this\" for the calling person.\n\nPer person, not per organization: two operators watching the same pass have\nread different things, and clearing the marker for a colleague is how a\nchange nobody acknowledged goes unnoticed. Read scope, not write: this\nrecords that somebody LOOKED, and changes nothing about the pass.",
        "operationId": "markBookingConfigEventsSeen",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_ConfigEventList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Mark this pass's configuration changes as read by me.",
        "tags": [
          "Bookings"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/files/download": {
      "get": {
        "description": "One request instead of one per file, because a pass routinely produces dozens.\n\nStreamed while it is being built: a pass's captures can be gigabytes, and\nthe archive leaves the hub chunk by chunk rather than after it is complete.\nStored, not deflated: mission captures are already compressed.",
        "operationId": "downloadBookingFiles",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "token",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Token"
            }
          },
          {
            "in": "query",
            "name": "file_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "title": "File Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Every file from one pass, as a zip.",
        "tags": [
          "Files"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/files/link": {
      "post": {
        "description": "One expiring link that downloads a pass's files as a bundle.\n\nThe link carries a signed token in its query string and needs no bearer\ncredential, so it can be handed to somebody outside Umoja. **Treat it as\na credential**: anybody holding the URL can download those files until it\nexpires.\n\nThe file set is fixed and SIGNED INTO the token at mint time. It is never\n\"whatever this pass holds when the link is opened\", so a file uploaded\nafterwards is not included, and the link can never reach further than the\nminting caller could at the moment they asked. Send `file_ids` to choose\na subset; omit it for every file of the pass that the caller can\ncurrently reach. Ids that do not belong to this pass are ignored, and a\nrequest naming only such ids is 404.\n\n`expires_seconds` sets the lifetime within the hub's permitted range; the\nresponse reports the window that was actually applied and the exact\n`expires_at`. There is no revocation: a link lives until it expires.\n\n404 also covers a pass with no reachable files at all. 503 means this hub\nhas no link-signing secret configured, so share links are unavailable.",
        "operationId": "mintBookingBundleLink",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BundleRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_DownloadLink_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "A shareable link for a pass's files, or a chosen subset.",
        "tags": [
          "Files"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/mission-params": {
      "get": {
        "description": "This pass's configuration, and whether it can still be changed.\n\nThe station runs its own live configuration. For this pass, these layers\napply on top of it:\n\n* `template_config` is your organization's template for this satellite at\n  this station.\n* `config` holds the overrides set on this pass and nothing else. Keys are\n  the station's own field paths (see `GET /stations/{id}/mission-fields`).\n* `effective_config` is the template with `config` merged over it. This is\n  what the modem is told for the pass. `resolved_from` lists the layers it\n  was built from.\n* `recorder_enabled` is `true` or `false` to record the pass or not, or\n  `null` to follow the satellite's default.\n* `editable_fields` is which paths this caller may set at this station.\n  The catalog is per station and per policy, so it is not the same list\n  everywhere.\n* `editable`, `locks_at` and `lock_reason` say whether it can still\n  change. The lock falls when the scheduler pushes the configuration to\n  the station ahead of the contact; after that a write is 409 and the\n  only way to change anything is live on the station.\n\nAccepts either the pass id or the booking id. A booking the caller may\nnot act for is reported as 404, not 403.",
        "operationId": "getBookingMissionParams",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_PassMissionParamsOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "What this pass will be flown with, and until when it can change.",
        "tags": [
          "Bookings"
        ]
      },
      "patch": {
        "description": "Change what this pass will fly with. This REPLACES `config`, it does not merge.\n\nSending `config` replaces this pass's own configuration wholesale.\nAnything previously set and not sent again is cleared, and the response's\n`report.cleared` lists exactly what that removed. `recorder_enabled` is set\nseparately: if you leave it out, it keeps its current value.\n\nNothing is written unless every field is permitted. A field this caller\nmay not set at this station fails the whole request with 403 and\n`error_code: mission_field_not_permitted`, carrying the per-field report.\nA half-applied configuration is worse than a refusal.\n\nPass `?dry_run=true` to run every check and write nothing. It returns the\nsame body, including the report, so a client can show what a save would\ndo before offering it. The portal and a customer's CI make the identical\ncall, which is what keeps the two from drifting apart.\n\n409 with `error_code: pass_locked` means the configuration has already\ngone to the station; `details.locks_at` says when that happened. Editing\nis over at that point, so change it live on the station instead. Nothing is\npushed to the modem by this call in any case.\n\nThe response also carries `report.missing_required`: required fields with\nno value from any layer once this configuration is in force. That is\nreported, not refused, so it can be fixed before the pass reaches prepass.",
        "operationId": "setBookingMissionParams",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "dry_run",
            "required": false,
            "schema": {
              "default": false,
              "title": "Dry Run",
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchMissionParamsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_PassMissionParamsOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Edit this pass's configuration. Locked once sent to the station.",
        "tags": [
          "Bookings"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/recorder": {
      "patch": {
        "description": "Turn recording on or off for this one pass.\n\n`enabled: true` or `false` overrides just this pass. `enabled: null`\nREMOVES the override, so the pass falls back to the satellite's\norganization-wide default, which is not the same as `false` and is how\nyou undo a choice rather than invert it. Set the default itself with\n`PUT /satellites/{satellite_id}/recording-default`.\n\nIts own route rather than a field on the mission-parameter PATCH because\nit is toggled from the pass header, and it is the one setting that is\nalways resolved rather than merely overridden.\n\nSubject to the same lock: 409 with `error_code: pass_locked` once the\nconfiguration has gone to the station. Returns the full mission-parameter\nview, so `resolved.recorder_enabled` shows what the pass will actually do.",
        "operationId": "setBookingRecorder",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetRecorderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_PassMissionParamsOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Record this pass, or fall back to the satellite's default.",
        "tags": [
          "Bookings"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/replay": {
      "get": {
        "description": "An index of what this pass left behind, before fetching any of it.\n\nTwo kinds of recording, listed separately:\n\n* `ttc` holds decoded TT&C frames, one entry per stream with its frame count\n  and first and last capture time. Read them with\n  `GET /bookings/{booking_id}/ttc`.\n* `graph_streams` names the archived sample streams (spectrum and\n  similar). Their chunks are listed by\n  `GET /bookings/{booking_id}/streams`.\n\nEither list may be empty: a pass that recorded nothing, or one whose\narchive has aged out, is not an error.\n\nAddressed by BOOKING, not by pass: a pass flown twice has two recordings,\none per reservation. `ends_at` is null while an open-ended session is\nstill running, so a scrubber has no end to draw against yet.\n\nScoped exactly like the booking itself: a caller who cannot see the\nbooking gets 404 here, not 403.",
        "operationId": "getBookingReplaySummary",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_ReplaySummary_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "What was recorded for this pass.",
        "tags": [
          "Replay"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/streams": {
      "get": {
        "description": "Chunk names sort chronologically, so the listing IS the timeline. A\nplayer picks the chunk covering the moment it is scrubbed to rather than\npulling a whole pass to show one second of it.",
        "operationId": "getBookingStreamInventory",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_StreamInventory_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "The recorded chunks, per stream.",
        "tags": [
          "Replay"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/streams/{stream}/{chunk}": {
      "get": {
        "description": "Records are `[u64be capture_ms][u32be length][payload]`, repeated.",
        "operationId": "downloadBookingStreamChunk",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "stream",
            "required": true,
            "schema": {
              "title": "Stream",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "chunk",
            "required": true,
            "schema": {
              "title": "Chunk",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": "One chunk of the recorded stream: `[u64be capture_ms][u32be length][payload]` repeated until the end of the body.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "One recorded chunk, as timestamped frames.",
        "tags": [
          "Replay"
        ]
      }
    },
    "/api/v1/bookings/{booking_id}/ttc": {
      "get": {
        "description": "Decoded TT&C frames for one pass, oldest first.\n\nPaging is by cursor, not offset: take `next_after` from the response and\nsend it as `after` for the next page. A null `next_after` means the last\npage. `total` is sent on the FIRST page only (when `after` is omitted),\nit does not change while a finished pass is read back, so keep the value\nyou were given rather than asking again.\n\n`stream` narrows to one stream; `GET /bookings/{booking_id}/replay` lists\nwhich exist and how many frames each holds.\n\nEach frame's payload is base64 in `frame_b64`. `captured_at` is the\nmodem's own timestamp, and `at` places the frame on the hub's timeline,\nthe clock recorded graph chunks use: play back on `at`. Only frames captured\nwithin the recording window of this booking are returned. A shared dish\nflushes its whole backlog when its agent reattaches, and another\norganization's contact must not be served here.",
        "operationId": "getBookingTtcFrames",
        "parameters": [
          {
            "in": "path",
            "name": "booking_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Booking Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "stream",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Stream"
            }
          },
          {
            "in": "query",
            "name": "after",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "After"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 500,
              "maximum": 2000,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_FramePage_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Recorded TT&C frames, oldest first.",
        "tags": [
          "Replay"
        ]
      }
    },
    "/api/v1/celestrak": {
      "get": {
        "description": "Search the public catalog the hub mirrors, not your own fleet.\n\nFor your own satellites use `GET /satellites`. This is for looking up an\nobject Umoja holds no satellite record for, typically to find a catalog\nnumber before creating one.\n\nGive `q` for a person typing (it matches a substring of the object name\nOR the start of the catalog number), or `name` and `norad_id` for an\nexact program. Repeat `norad_id` for several at once. Paging is\n`limit`/`offset`, and `total` is the full match count so a client can\ntell whether more remains.\n\nEach object carries the mirrored OMM record plus the same elements\nrendered as TLE lines. `tle1` and `tle2` are ABSENT for an object whose\nrecord will not render as two lines; `omm` is always present.\n\nNothing here is per-tenant, so any authenticated caller sees the same\nanswer, and nothing here can be written. To steer a satellite you own on\ndifferent elements, set an override with `PUT /satellites/{id}/tle`.",
        "operationId": "listCelestrakObjects",
        "parameters": [
          {
            "description": "Free-text search, for a person typing: matches a substring of the object name OR the start of the catalog number.",
            "in": "query",
            "name": "q",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Free-text search, for a person typing: matches a substring of the object name OR the start of the catalog number.",
              "title": "Q"
            }
          },
          {
            "description": "Case-insensitive substring of CelesTrak's object name.",
            "in": "query",
            "name": "name",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Case-insensitive substring of CelesTrak's object name.",
              "title": "Name"
            }
          },
          {
            "description": "One or more catalog numbers. Repeat the parameter for several.",
            "in": "query",
            "name": "norad_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "One or more catalog numbers. Repeat the parameter for several.",
              "title": "Norad Id"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 500,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "default": 0,
              "minimum": 0,
              "title": "Offset",
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_CatalogObjectList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Search the mirrored CelesTrak catalog.",
        "tags": [
          "CelesTrak"
        ]
      }
    },
    "/api/v1/celestrak/status": {
      "get": {
        "description": "How much of CelesTrak's catalog the hub holds, and how old the copy is.\n\nRead this before trusting a mirrored orbit. `last_fetched_at` is when the\ncopy was taken; `objects` is how many it contains.\n`next_fetch_in_seconds` is how long until the hub is allowed to refresh\nagain. CelesTrak asks consumers not to poll, so the hub enforces its own\ninterval, and 0 means a refresh may run at any time. `enabled` false means\nmirroring is switched off entirely and the copy will not change.\n\nNo scoping: the mirror is a copy of a public catalog, not tenant data.",
        "operationId": "getCelestrakStatus",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_CatalogStatusOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "How many objects the mirror holds, and how fresh it is.",
        "tags": [
          "CelesTrak"
        ]
      }
    },
    "/api/v1/celestrak/{norad_id}": {
      "get": {
        "description": "One mirrored object, by catalog number.\n\nSame record `GET /celestrak` returns in a list: the OMM plus the elements\nrendered as TLE lines, with `tle1`/`tle2` absent when the record will not\nrender. Accepts a plain catalog number.\n\n404 means the object is not in this copy of the catalog, which is not the\nsame as saying it does not exist: the mirror carries CelesTrak's active\ngroup as of the last fetch. Check `GET /celestrak/status` for how fresh\nthat is.",
        "operationId": "getCelestrakObject",
        "parameters": [
          {
            "in": "path",
            "name": "norad_id",
            "required": true,
            "schema": {
              "title": "Norad Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_CatalogObjectOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "One mirrored catalog object by its NORAD number.",
        "tags": [
          "CelesTrak"
        ]
      }
    },
    "/api/v1/files": {
      "get": {
        "description": "The mission-file archive, newest first, scoped to the caller.\n\nA file is reachable when the caller can reach the station and the\nsatellite it came from; there is no way to list another organization's.\n\nFilter by `station_id`, `satellite_id` (each repeatable, and each taking\na station by UUID, a satellite by\nUUID, NORAD number or name), `booking_id` for one pass, `from`/`to`\nover capture time, `status`, and `search` for free text over the filename\nand satellite name. Filtering happens in the query, not on a page, so a\nsearch covers the whole archive rather than whatever loaded first.\n\nPaging is by opaque cursor: send `next_cursor` back as `cursor` for the\nnext page, and a response without one is the last page. A cursor is not a\nposition to compute, and a malformed one is 400.\n\nThis returns METADATA. Fetch the bytes with\n`GET /files/{file_id}/download`, or mint a shareable link with\n`POST /files/{file_id}/link`.",
        "operationId": "listMissionFiles",
        "parameters": [
          {
            "description": "Station UUID. Repeatable.",
            "in": "query",
            "name": "station_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Station UUID. Repeatable.",
              "title": "Station Id"
            }
          },
          {
            "description": "Satellite UUID, NORAD id or name. Repeatable.",
            "in": "query",
            "name": "satellite_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Satellite UUID, NORAD id or name. Repeatable.",
              "title": "Satellite Id"
            }
          },
          {
            "in": "query",
            "name": "booking_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Booking Id"
            }
          },
          {
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "From"
            }
          },
          {
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "To"
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/FileState"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "description": "Matches filename or satellite name.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 200,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Matches filename or satellite name.",
              "title": "Search"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 100,
              "maximum": 500,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_FileList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Mission files the caller can reach, newest first.",
        "tags": [
          "Files"
        ]
      }
    },
    "/api/v1/files/summary": {
      "get": {
        "description": "Totals over the whole filtered set, not over one page. The portal\nshows them above a list that is paginated.",
        "operationId": "getMissionFilesSummary",
        "parameters": [
          {
            "description": "Station UUID. Repeatable.",
            "in": "query",
            "name": "station_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Station UUID. Repeatable.",
              "title": "Station Id"
            }
          },
          {
            "description": "Satellite UUID, NORAD id or name. Repeatable.",
            "in": "query",
            "name": "satellite_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Satellite UUID, NORAD id or name. Repeatable.",
              "title": "Satellite Id"
            }
          },
          {
            "in": "query",
            "name": "booking_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Booking Id"
            }
          },
          {
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "From"
            }
          },
          {
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "To"
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/FileState"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "description": "Matches filename or satellite name.",
            "in": "query",
            "name": "search",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maxLength": 200,
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Matches filename or satellite name.",
              "title": "Search"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_FilesSummary_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Counts and bytes for everything the caller can reach.",
        "tags": [
          "Files"
        ]
      }
    },
    "/api/v1/files/{file_id}": {
      "delete": {
        "description": "Removes the object first, then the row.\n\nThat order is deliberate: a row without an object shows as a broken\ndownload, while an object without a row is invisible and unreclaimable.\nIf the object is already gone the delete still proceeds. The caller asked\nfor it to not exist.",
        "operationId": "deleteMissionFile",
        "parameters": [
          {
            "in": "path",
            "name": "file_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "File Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_dict_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Delete a mission file and its bytes.",
        "tags": [
          "Files"
        ]
      }
    },
    "/api/v1/files/{file_id}/download": {
      "get": {
        "description": "Streamed through the hub rather than handed out as a presigned URL.\n\nThe object store is not reachable from everywhere the API is, and a\npresigned URL would also hand out access that outlives this request's\nauthorization. The cost is hub bandwidth on the way out.",
        "operationId": "downloadMissionFile",
        "parameters": [
          {
            "in": "path",
            "name": "file_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "File Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "token",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Token"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "format": "binary",
                  "type": "string"
                }
              }
            },
            "description": "The file's bytes, streamed.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "security": [],
        "summary": "The file's bytes.",
        "tags": [
          "Files"
        ]
      }
    },
    "/api/v1/files/{file_id}/link": {
      "post": {
        "description": "Reach is checked here, once. Whoever holds the link afterwards can\ndownload it until it expires. That is what makes it shareable.",
        "operationId": "mintMissionFileLink",
        "parameters": [
          {
            "in": "path",
            "name": "file_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "File Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "expires_seconds",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maximum": 86400,
                  "minimum": 60,
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Expires Seconds"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_DownloadLink_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "A shareable, expiring download link for one file.",
        "tags": [
          "Files"
        ]
      }
    },
    "/api/v1/me": {
      "get": {
        "description": "Who the bearer token says you are, and what it is scoped to.\n\nThe answer describes the TOKEN, not a resource, so it needs no\npermissions beyond a valid credential. It is the right first call after\nobtaining one: `organization.id` is the tenant every other endpoint\nscopes to, and everything you can read or write follows from it.\n\n`organization` is what this request ACTS AS and `home_organization` is\nwhat the credential itself names. They are equal unless the caller has\nswitched into another organization they are permitted to act for, in which\ncase reads and writes follow `organization`.\n\n`is_admin` says whether this caller may switch at all, and is false for an\nordinary API credential. It does not say this particular request carries\nthat authority; that follows `organization`.\n\nBoth ids come back with the display name beside them, so a client never\nhas to resolve a bare UUID against a directory it cannot reach.",
        "operationId": "getCurrentUser",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_Me_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "The caller, as their token proves them.",
        "tags": [
          "Identity"
        ]
      }
    },
    "/api/v1/me/organization": {
      "get": {
        "description": "Your own tenant: id, display name, alias and API client id.\n\nThe organization comes from the token, never from a path, so a caller\ncannot name another one. It is the tenant everything else you read and\nwrite is scoped to.\n\n`api_client_id` is the OAuth client your integrations authenticate as.\nthe id to pair with the secret from\n`POST /me/organization/rotate`. It is absent for an organization that has\nno API client provisioned, which is how a portal-only tenant looks.\n\nFor the caller as a PERSON rather than as a tenant, use `GET /me`.",
        "operationId": "getMyOrganization",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_OrganizationSummary_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "The organization this credential acts as.",
        "tags": [
          "Organizations"
        ]
      }
    },
    "/api/v1/me/organization/members": {
      "get": {
        "description": "Everyone in the caller's own organization.\n\nScoped to the token: there is no id to pass, and no way to ask about\nanother organization.",
        "operationId": "listMyOrganizationMembers",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_MemberListOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Your colleagues.",
        "tags": [
          "Organizations"
        ]
      }
    },
    "/api/v1/me/organization/rotate": {
      "post": {
        "description": "Issues a new client secret and invalidates the old one at once.\n\nThere is no overlap window: the moment this returns, anything still\nholding the previous secret fails to authenticate. Tokens already minted\nkeep working until they expire, so the failure shows up at the next token\nrequest rather than immediately.\n\n**The secret is returned once and is not retrievable afterwards.** If it\nis lost, the only recovery is to rotate again, which breaks the\nintegrations a second time. Store it before acknowledging the response.\n\nRotates the secret for the caller's OWN organization, taken from the\ntoken. There is no path parameter and no way to rotate another\ntenant's.",
        "operationId": "rotateMyOrganizationSecret",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_SecretRotated_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Replace your client secret. Your running integrations stop until they are updated.",
        "tags": [
          "Organizations"
        ]
      }
    },
    "/api/v1/me/organization/token": {
      "post": {
        "description": "A convenience for trying the API from a browser session.\n\nThe hub mints a client-credentials token for the caller's own\norganization using the secret it already holds, so you get a working\nbearer token without handling the secret yourself. `expires_in` is its\nlifetime in seconds; it is not refreshable, so call again for another.\n\nThis is NOT how a service should obtain tokens. A machine integration\nauthenticates directly against the identity provider's token endpoint\nwith its own client id and secret, so its credentials do not depend on\nsomebody being signed in to the portal.\n\nAlways the caller's own organization, taken from the token. There is no\npath parameter.",
        "operationId": "mintMyOrganizationToken",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_MintedToken_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "A short-lived access token for your own organization.",
        "tags": [
          "Organizations"
        ]
      }
    },
    "/api/v1/notifications": {
      "get": {
        "description": "Newest first, and only what is addressed to the caller.\n\nA notification reaches the caller three ways: it names them personally, it\nnames their organization, or it is fleet-wide. There is no way to read\nanother person's.\n\n`unread` is the badge and is counted over everything addressed to the\ncaller, ignoring every filter on this request. A badge that fell when a\nfilter was applied would be answering a question nobody asked.\n\nPaging is by time, not by offset: pass the oldest `created_at` you have\nback as `before` for the page behind it. A client that ACTS on\nnotifications should instead poll with `since` set to the last\n`created_at` it processed and `kind` set to the kinds it handles, so it\nsees what is new without paging through what it does not care about.\n`GET /notifications/kinds` lists the accepted kinds.\n\nEach item carries `pass_id` when the notification is about a pass, which\nis what `GET /passes/{pass_id}` resolves; `booking_id` is the\nreservation, and the two are different addresses.\n\nNotifications are also delivered live over the realtime socket; this\nendpoint is the history and the source of truth for read state.",
        "operationId": "listNotifications",
        "parameters": [
          {
            "in": "query",
            "name": "unread_only",
            "required": false,
            "schema": {
              "default": false,
              "title": "Unread Only",
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "before",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Before"
            }
          },
          {
            "in": "query",
            "name": "since",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Since"
            }
          },
          {
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/NotificationKind"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Kind"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_NotificationList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Notifications addressed to me.",
        "tags": [
          "Notifications"
        ]
      }
    },
    "/api/v1/notifications/kinds": {
      "get": {
        "description": "What `?kind=` accepts.\n\nPublished so a client can subscribe to the kinds it handles without\nhardcoding a list that goes stale the next time one is added, which is\nhow a client ends up silently ignoring a notification it was written to\nact on.",
        "operationId": "listNotificationKinds",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_list_str__"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Every kind a notification can have.",
        "tags": [
          "Notifications"
        ]
      }
    },
    "/api/v1/notifications/read": {
      "post": {
        "description": "Marks the given ids read for the calling user only.\n\nRead state is per person: marking one read does not clear it for a\ncolleague who received the same organization-wide notification.\n\nIds not addressed to the caller are silently skipped rather than\nrejected, so `marked` may be lower than the number of ids sent. A 404 on\nsomeone else's id would confirm that it exists. Idempotent: re-marking an\nalready-read notification is not an error, and it still counts towards\n`marked`.",
        "operationId": "markNotificationsRead",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MarkRead"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_dict_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Mark specific notifications read.",
        "tags": [
          "Notifications"
        ]
      }
    },
    "/api/v1/notifications/read-all": {
      "post": {
        "description": "Clears the caller's badge in one call.\n\nCovers everything addressed to the caller at this moment, personal,\norganization-wide and fleet-wide alike, and only for the calling user.\n`marked` is how many rows were newly marked, so a second call returns 0.",
        "operationId": "markAllNotificationsRead",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_dict_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Mark every notification read.",
        "tags": [
          "Notifications"
        ]
      }
    },
    "/api/v1/passes": {
      "get": {
        "description": "The schedule: predicted passes, with availability already worked out.\n\nThis is where booking starts. Each item carries `availability`, so the\ncaller does not have to cross-reference the calendar to learn whether a\nwindow is free: `status` is `open`, `booked` or `unavailable`, and an\nunavailable one says why (another organization holds it, the antenna is\nbusy on a different pass, somebody drove the station directly, an\nadjacent booking's turnaround, or a claim from a pass stopped part way\nthrough).\n\nOnly passes over stations AND satellites the caller can reach are\nreturned. Identities inside a reservation are redacted unless it belongs\nto the caller's own organization.\n\nFilter with `station_id` and `satellite_id` (each repeatable),\n`from`/`to` over the window, `elevation_from`/`elevation_to` over peak\nelevation, and `status`. `scope` narrows to what the caller booked\n(`me`), what their organization booked (`org`), or everything reachable\n(`any`, the default). A reversed range, meaning `from` after `to` or\n`elevation_from` above `elevation_to`, is 400 with\n`error_code: invalid_filter_combination` rather than an empty page.\n\nPaging is by opaque cursor: send `next_cursor` back as `cursor`; a\nresponse without one is the last page. A malformed cursor is 400.\n\nBook from here with `POST /passes/book`, which takes the `id` of each\nitem.",
        "operationId": "listPasses",
        "parameters": [
          {
            "in": "query",
            "name": "station_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "format": "uuid",
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Station Id"
            }
          },
          {
            "in": "query",
            "name": "satellite_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Satellite Id"
            }
          },
          {
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "From"
            }
          },
          {
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "To"
            }
          },
          {
            "in": "query",
            "name": "elevation_from",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maximum": 90,
                  "minimum": 0,
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Elevation From"
            }
          },
          {
            "in": "query",
            "name": "elevation_to",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "maximum": 90,
                  "minimum": 0,
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Elevation To"
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/PassStatus"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "in": "query",
            "name": "scope",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Scope",
              "default": "any"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 100,
              "maximum": 500,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "cursor",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Cursor"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_PassPage_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Predicted passes the caller can reach, with availability resolved.",
        "tags": [
          "Passes"
        ]
      }
    },
    "/api/v1/passes/book": {
      "post": {
        "description": "Always 207: each id gets its own result row, so one conflict never costs\nthe caller the rest of the batch. A single booking is a one-element list.",
        "operationId": "bookPasses",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "207": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_BookReport_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Book one or many passes.",
        "tags": [
          "Passes"
        ]
      }
    },
    "/api/v1/passes/unbook": {
      "post": {
        "description": "Give back one or many reservations. Always 207, one row per id.\n\nA partial failure never costs the caller the rest of the batch, so the\nstatus is 207 even for a single id and even when every row succeeded.\nread `items`, not the status code. A single cancellation is a\none-element list.\n\n`result` per row:\n\n| Value | Meaning |\n| --- | --- |\n| `unbooked` | Released. The slot is free and the station was told to stand down. |\n| `not_booked` | Nothing was holding it. |\n| `not_found` | No such pass, or not one the caller can reach. |\n| `permission_denied` | Reachable, but not the caller's to cancel. |\n| `station_refused` | The station would not let it go, so the booking STILL STANDS. The slot is deliberately not freed while the modem is still committed to it. |\n| `ambiguous` | A continuously visible satellite with more than one live session: naming the pass does not say which to release. Cancel it by booking id. |\n| `error` | Something else failed; `message` says what. |\n\nAccepts pass ids or booking ids. Cancelling a pass that is already\nrunning stops it: the station stands down and post-pass restore runs.",
        "operationId": "unbookPasses",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UnbookRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "207": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_UnbookReport_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Cancel one or many pass bookings.",
        "tags": [
          "Passes"
        ]
      }
    },
    "/api/v1/passes/{pass_id}": {
      "get": {
        "description": "One predicted pass, with more than the list carries.\n\nAdds `booking`, the reservation, present only when the caller may see it\n(ordinarily their own organization's), and\n`realtime`, the window during which that booking's live streams are open.\n`segments` repeats the availability offer from the list, so a page that\nbooks does not have to go back to it.\n\n`predicted_at` is when the window was computed, and `elements_epoch` is\nthe age of the orbital elements it was computed from; both are worth\nreading before trusting a far-future window. `predicted_at` is absent for\na pass whose prediction has been swept and which is now known only from\nits booking.\n\nAccepts the pass id or the id of a booking on it. A pass over a station\nor satellite the caller cannot reach is 404, not 403: whether it exists\nis not theirs to learn.",
        "operationId": "getPass",
        "parameters": [
          {
            "in": "path",
            "name": "pass_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Pass Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_PassDetail_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "One pass, with its reservation when the caller may see it.",
        "tags": [
          "Passes"
        ]
      }
    },
    "/api/v1/passes/{pass_id}/conflicts": {
      "get": {
        "description": "Why a window is unavailable, not merely that it is.\n\nAddressable by either identity, a prediction id or the id of the booking\non it, and reached through the same station and satellite reaches as every\nother pass route.\n\nTwo kinds of obstacle: a live `booking`, and a `claim`, which is a pass\nstopped part way through whose stretch still belongs to its organization.\nThese are exactly what booking refuses on.\n\nDetail is scoped. A caller always learns that something blocks the window\nand when; the identity behind it (`booking_id`, `pass_id`,\n`organization_name`) is present only for their own organization, and for\nplatform admins. Otherwise one tenant's schedule would be readable through\nanother's conflict list.",
        "operationId": "listPassConflicts",
        "parameters": [
          {
            "in": "path",
            "name": "pass_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Pass Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_ConflictList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "What is in the way of booking this pass.",
        "tags": [
          "Passes"
        ]
      }
    },
    "/api/v1/satellites": {
      "get": {
        "description": "Your fleet, plus every satellite another organization has granted you.\n\nTwo different rights appear here and they are not the same:\n\n* `owned` means your organization owns it. Ownership is the right to CHANGE\n  it: its elements, its station assignments, its templates.\n* access, so you may book passes on it. Every satellite in this list is at\n  least reachable; most are not owned.\n\nGate edit controls on `can_edit`, not on `owned`: an administrator may\nedit a satellite they do not own, and a client that read `owned` instead\nlocked admins out of everything.\n\nFilter with `?owned=true` for your own fleet only, `?status=` by approval\nstate (a newly registered satellite starts pending), and `?origin=` by\nwhere the record came from: Umoja's own registration, or a station that\nalready had it configured.\n\nFor an object Umoja holds no record of at all, search the mirrored public\ncatalog with `GET /celestrak`.",
        "operationId": "listSatellites",
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/ApprovalStatus"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "in": "query",
            "name": "origin",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/SatelliteOrigin"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Origin"
            }
          },
          {
            "in": "query",
            "name": "owned",
            "required": false,
            "schema": {
              "default": false,
              "title": "Owned",
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_SatelliteList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Satellites this caller can reach.",
        "tags": [
          "Satellites"
        ]
      },
      "post": {
        "description": "Starts pending approval.\n\nElements are optional: the hub fills them from its CelesTrak copy when the\ncatalog number is listed there, and the satellite waits as\n`awaiting_elements` when it is not.",
        "operationId": "createSatellite",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateSatelliteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_SatelliteOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Register a satellite. Name and catalog number; elements optional.",
        "tags": [
          "Satellites"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}": {
      "delete": {
        "description": "Delete a satellite. Bookings still to run are cancelled and kept;\nbookings that already ran are untouched and still name what they flew.",
        "operationId": "deleteSatellite",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_dict_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Delete a satellite and stop every station tracking it.",
        "tags": [
          "Satellites"
        ]
      },
      "get": {
        "description": "The same record the list returns, for one satellite.\n\n`owned` says your organization owns it; `can_edit` says THIS caller may\nchange it, which also covers an administrator who owns nothing. Gate edit\ncontrols on `can_edit`.\n\n`stations` pairs what Umoja has ASSIGNED (`assigned`) against what each\nstation reports it is actually tracking (`tracking`). The two disagreeing\nis the normal signal that a push is needed. See\n`GET /satellites/{satellite_id}/elements`.\n\nA satellite the caller cannot reach is 404, not 403.",
        "operationId": "getSatellite",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_SatelliteOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "One satellite.",
        "tags": [
          "Satellites"
        ]
      },
      "patch": {
        "description": "Description and contact are the hub's own record and reach no station.\n\nThe name does: Expedite keys `/track/*` on it, so changing it re-registers\nthe satellite at every station tracking it. That is refused when a station\nhas a mission file assigned to the old name, because the hub cannot put\nthat assignment back.",
        "operationId": "updateSatellite",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSatelliteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_SatelliteOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Edit a satellite your organization owns, whatever its origin.",
        "tags": [
          "Satellites"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/elements": {
      "get": {
        "description": "The hub's elements, and what every assigned station's modem holds.\n\nThe drift view. A station predicts its own passes from the elements IT\nholds, so a station carrying an older set points its antenna on its own\nanswer, and this is where that shows.\n\nPer station: the epoch and lines the modem reported, `in_sync` against\nthe hub's record, and `reason` for why they do or do not match.\n`read_at` is when the modem was last asked and is ABSENT when it never\nwas (`reason: not_read`); `stale` means that reading is old, and\n`superseded_at` that the hub's elements changed after it. `status` is the\nstation's own state, so a client can say why a push is unavailable rather\nthan only that it is.\n\n`drift` at the top is true when any assigned station disagrees.\n\nConvergence is never automatic. Re-read the modems with\n`POST /satellites/{satellite_id}/elements/refresh`, and push with\n`POST /satellites/{satellite_id}/elements/push`.\n\nNeeds access to the satellite, not ownership.",
        "operationId": "getSatelliteElements",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_ElementsOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Authoritative elements, plus what each assigned station's modem holds.",
        "tags": [
          "Satellites"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/elements/push": {
      "post": {
        "description": "Write the hub's elements to every assigned station's modem.\n\nThis is the call that makes the fleet agree. It registers the satellite\nat each assigned station if it is not there yet and installs the current\nelements, so a station that had drifted now predicts from the same orbit\nthe hub does.\n\nIt is never automatic, because setting elements does not push them, so this is\nan explicit, operator-driven convergence step. Stations that support OMM\nreceive the record; the rest receive the TLE lines rendered from it.\n\nOne result row per station, each with its own `ok` and `detail`. An\noffline station fails its own row and the others still go through; ask\nagain when it is back. Read\n`GET /satellites/{satellite_id}/elements` afterwards to confirm.\n\nRequires ownership of the satellite.",
        "operationId": "pushSatelliteElements",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_StationActionReport_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Register this satellite and its elements at every assigned station.",
        "tags": [
          "Satellites"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/elements/refresh": {
      "post": {
        "description": "Ask every assigned station what elements it currently holds.\n\nREAD-ONLY: nothing is sent to a modem, and no station's elements change.\nIt refreshes the readings behind `GET /satellites/{satellite_id}/elements`,\nwhich is what to read afterwards.\n\nOne result row per assigned station, each with its own `ok` and `detail`\nAn offline or unanswering station fails its row without failing the\nothers, so a partial answer is the normal outcome for a fleet.\n\nNeeds access to the satellite; unlike the push, it does not need\nownership, because it changes nothing.",
        "operationId": "refreshSatelliteElements",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_StationActionReport_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Ask each assigned station what elements it holds (read-only).",
        "tags": [
          "Satellites"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/mission-templates": {
      "get": {
        "description": "Every template, or with `station_id` only those authored for it.\n\nFiltering on section existence is what the booking form wants: a template\nwith nothing written for this station has nothing to offer there, and that\nis a row lookup rather than a comparison of its fields against the\nstation's.",
        "operationId": "listMissionTemplates",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "station_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Station Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_TemplateList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Reusable mission configurations for this satellite.",
        "tags": [
          "Missions"
        ]
      },
      "post": {
        "description": "A reusable configuration for this satellite, written per station.\n\nA template carries no configuration of its own. It is a name plus one\nSECTION per station it applies at. That is deliberate: a field one site\nhas and another does not cannot be authored against \"no station in\nparticular\" and then silently dropped at the second.\n\n`sections` maps station id to that station's section, so an automation\ncan author a whole fleet in one call; a portal typically sends exactly\none. `default_at_station_id` makes this the template that station flies\nwhen a pass names none. It must be a station this same body writes a\nsection for, otherwise the default would point at a configuration that\ncannot be applied, and the call is 409.\n\nRequires OWNERSHIP of the satellite, not merely access to it. A field the\ncaller may not set at a station is refused with the rest of that section;\n`GET /satellites/{satellite_id}/mission-templates` lists\n`editable_fields`, which is what an editor should offer.",
        "operationId": "createMissionTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateTemplateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_TemplateOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "A named configuration, with a section per station it applies at.",
        "tags": [
          "Missions"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/mission-templates/{template_id}": {
      "delete": {
        "description": "Removes the template everywhere at once. Every station's section goes\nwith it.\n\nPasses already booked are unaffected: their parameters were copied when\nthey were set, so a pass that was configured from this template still\nflies what it was given.\n\nIf it was the default at a station, that station is left with no default\nand a pass there falls back to whatever the station binding resolves.\n\nRequires ownership of the satellite. To stop offering a template at ONE\nstation while keeping it elsewhere, delete that section instead.",
        "operationId": "deleteMissionTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "template_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Template Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_dict_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Delete a template and every section of it.",
        "tags": [
          "Missions"
        ]
      },
      "patch": {
        "description": "Edit a template: its name, its description, or its section at a station.\n\nOnly what is sent changes. `sections` touches ONLY the stations it names\nA station left out of the map is left exactly as it was, so editing one\nsite cannot quietly blank another. A named station's section is REPLACED,\nnot merged. To stop offering the template at a station, use\n`DELETE .../sections/{station_id}` rather than sending an empty section.\n\n`default_at_station_id` moves that station's default to this template;\nomitting it leaves every default where it is. The section is applied\nfirst, so the same call may introduce the section it then makes default.\nA default naming a station with no section is 409.\n\nRequires ownership of the satellite. Passes already booked keep whatever\nconfiguration they were given. Their parameters were copied when they\nwere set, so editing a template never changes a pass that is already\nscheduled.",
        "operationId": "updateMissionTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "template_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Template Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateTemplateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_TemplateOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Rename it, or rewrite its section at one or more stations.",
        "tags": [
          "Missions"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/mission-templates/{template_id}/sections/{station_id}": {
      "delete": {
        "description": "The template survives; it simply no longer applies here.\n\nDeleting the last section leaves an empty template rather than removing\nit: a name somebody chose is not the hub's to discard, and DELETE on the\ntemplate itself is how you mean that.",
        "operationId": "deleteMissionTemplateSection",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "template_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Template Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "station_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Station Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_TemplateOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Stop offering this template at one station.",
        "tags": [
          "Missions"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/mission-templates/{template_id}/sections/{station_id}/default": {
      "post": {
        "description": "One default per (organization, satellite, STATION).\n\nPer station, because an operator with two sites wants a different\nconfiguration at each, which is the whole reason a template is a set of\nper-station sections. `satellite_station_default_templates` keys on all\nthree, so a second default at one station cannot be written.\n\nRefused when this template has no section for that station: a default\nnaming a configuration that cannot be applied there is worse than none.",
        "operationId": "setDefaultMissionTemplate",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "template_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Template Id",
              "type": "string"
            }
          },
          {
            "in": "path",
            "name": "station_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Station Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_TemplateOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Make this the template this satellite flies when a pass names none.",
        "tags": [
          "Missions"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/recording-default": {
      "get": {
        "description": "Whether passes on this satellite record unless a pass says otherwise.\n\nThe organization-wide fallback, one layer below the per-pass setting from\n`PATCH /bookings/{booking_id}/recorder`. A pass with no recorder override\nfollows this.\n\n`record_by_default` is true for a satellite nobody owns: nothing has been\ndecided for it, so it follows the standing default rather than refusing\nto answer, and `owner_organization_id` is then absent. Reading needs\naccess to the satellite; changing it needs ownership.",
        "operationId": "getRecordingDefault",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_RecordingDefaultOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Whether this satellite's passes record unless told otherwise.",
        "tags": [
          "Missions"
        ]
      },
      "put": {
        "description": "Sets the organization-wide fallback for this satellite.\n\nApplies to passes that carry no recorder setting of their own. It does\nNOT change a pass that has already been given one explicitly. Clear that\npass's override with `PATCH /bookings/{booking_id}/recorder` and\n`enabled: null` to bring it back under this default.\n\nRequires ownership of the satellite, and the default is held per owning\norganization.",
        "operationId": "setRecordingDefault",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetRecordingDefaultRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_RecordingDefaultOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Set whether this satellite's passes record by default.",
        "tags": [
          "Missions"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/stations": {
      "put": {
        "description": "Replaces the whole assignment list. This is a PUT, not an add.\n\nSend every station that should track this satellite; any station missing\nfrom the list is unassigned and told to stop. To remove exactly one and\nleave the rest alone, use\n`DELETE /satellites/{satellite_id}/stations/{station_id}`.\n\nStations are named by their UUID, as `GET /stations` reports it. Assignment is the INTENT; it does not\nby itself put the elements on the modem. Follow with\n`POST /satellites/{satellite_id}/elements/push`, and read\n`GET /satellites/{satellite_id}/elements` to see which stations now\ndisagree.\n\n409 when the satellite's name is already taken at one of the new\nstations: a station catalogs by name, and two entries with one name is\nnot a state the hub will create. A satellite with no catalog number is\nidentified BY its name at a station, so its identity moves with this\nassignment.\n\nRequires ownership of the satellite.",
        "operationId": "setSatelliteStations",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetStationsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_SatelliteOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Set which stations should track this satellite.",
        "tags": [
          "Satellites"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/stations/{station_id}": {
      "delete": {
        "description": "Tell one station to stop tracking this satellite.\n\nThe narrow counterpart to `PUT /satellites/{satellite_id}/stations`,\nwhich replaces the whole list. This removes exactly one assignment and\nleaves the rest alone. The station is addressed by its id.\n\nOnly for satellites Umoja registered. One that originated AT a station\nwas configured there by an operator and is not the hub's to remove.\n\nThe hub records the intention first and drops its own assignment only\nonce the station confirms, so an unreachable station leaves the removal\npending rather than silently diverging. `ok` and `detail` say which\nhappened.\n\nRequires ownership of the satellite.",
        "operationId": "unregisterSatelliteFromStation",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          },
          {
            "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
            "in": "path",
            "name": "station_id",
            "required": true,
            "schema": {
              "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
              "format": "uuid",
              "title": "Station Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_dict_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Remove this satellite from one station's tracking catalog.",
        "tags": [
          "Satellites"
        ]
      }
    },
    "/api/v1/satellites/{satellite_id}/tle": {
      "delete": {
        "description": "Remove the operator override and follow the public catalog again.\n\nUndoes `PUT /satellites/{satellite_id}/tle`. The satellite goes back to\nthe mirrored CelesTrak elements and tracks them as they refresh.\n\nRefused when the mirror holds nothing for this satellite's catalog\nnumber, so there is always a live element set in force. The response is\nthe set now in effect. A satellite too new for CelesTrak, or one with no\ncatalog number, therefore cannot be reverted; its override is all it has.\n\nAs with setting them, assigned stations still hold the previous elements\nuntil pushed, and the hub recomputes predicted passes immediately.\n\nRequires ownership of the satellite.",
        "operationId": "clearSatelliteTle",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_TleOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Drop operator-set elements and go back to the CelesTrak catalog.",
        "tags": [
          "Satellites"
        ]
      },
      "get": {
        "description": "The elements the hub holds for this satellite, in both forms.\n\n`omm` is the record Umoja stores and is authoritative; `tle1`/`tle2` are\nthe same elements rendered as two lines, which is what a station without\nOMM support is actually sent. Read the lines when you need the exact 69\ncolumns a modem received.\n\n`operator_set` distinguishes an override somebody set here from elements\ntaken from the mirrored CelesTrak catalog. The person who set them is\ndeliberately not published.\n\nThis is the hub's record. For what each assigned station's modem is\nactually steering on, and which ones have drifted, use\n`GET /satellites/{satellite_id}/elements`.\n\nNeeds access to the satellite, not ownership.",
        "operationId": "getSatelliteTle",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_TleOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Orbital elements, as TLE lines and as OMM.",
        "tags": [
          "Satellites"
        ]
      },
      "put": {
        "description": "Override this satellite's orbit. Send EITHER an OMM record OR two lines.\n\nExactly one form per request: `omm`, or `tle1` and `tle2` together. Both\nor neither is 422. Prefer OMM if you have one: rendering it to lines and\nparsing them back drops every field a TLE has no column for.\n\nNo name is accepted in the body. The hub fills it from the satellite's\nown name when it dispatches to a station, because a station catalogs by\nname and a mismatch would create a SECOND entry there instead of updating\nthe first.\n\nThe record must be SGP4-compatible. Umoja serves every station TLE lines\nrendered from it, so elements a different propagator reads would be\npropagated as though they were SGP4, giving wrong pointing rather than a\nrefusal. A non-SGP4 `MEAN_ELEMENT_THEORY` is rejected, as is a record\nmissing the mandatory elements.\n\nThis makes the elements an OPERATOR OVERRIDE: the satellite stops\nfollowing the mirrored CelesTrak catalog until\n`DELETE /satellites/{satellite_id}/tle` puts it back. The stations are\nnot updated by this call. Assigned modems are now a set behind, which\n`GET /satellites/{satellite_id}/elements` shows and\n`POST /satellites/{satellite_id}/elements/push` resolves. Predicted\npasses are recomputed on the hub's side straight away, since new elements\nmean new windows.\n\nRequires ownership of the satellite.",
        "operationId": "setSatelliteTle",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetTleRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_TleOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Set orbital elements, as an OMM record or two lines. The name comes from the satellite.",
        "tags": [
          "Satellites"
        ]
      }
    },
    "/api/v1/stations": {
      "get": {
        "description": "Every station the caller holds access to, with what each one is and\nwhether it is usable right now.\n\nReaching a station here IS the right to book it, so this list is also the\nset of stations whose passes appear in `GET /passes`. A station nobody\nhas granted the caller is simply absent.\n\nEach entry carries the station's `id` (UUID), which is how every path\nnames a station, and its `client_id` \u2014 the short name its agent\nauthenticates under, published so an operator can match a station to the\nagent config on the box. The credential is not an address.\n\n`status` is the state, not a boolean: three of its values mean \"not\nusable\" and call for different responses, and `status_reason` says which.\n`capabilities` and `antenna_capabilities` say what the site can do; a\nfield that is null means the agent could not read it, NOT that the\nfeature is absent.\n\n`telemetry` is live antenna and weather readings and is served only while\nyour organization holds the antenna on a current booking (admins always\nreceive it). Its absence is the normal case for a healthy idle station\nand says nothing about health. Read `status` for that.",
        "operationId": "listStations",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_StationList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Ground stations this caller can reach.",
        "tags": [
          "Stations"
        ]
      }
    },
    "/api/v1/stations/booking-windows": {
      "get": {
        "description": "Deliberately NOT scoped to the caller's organization.\n\nA scheduler picking a slot has to see that an antenna is taken even when\nsomebody else took it; what it must not see is who. A window that is not\nthe caller's carries the station and the times and nothing else, not even\na null where the identity would be, because a null still says there is\nsomething here they are not being told.",
        "operationId": "getStationBookingWindows",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_BookingWindows_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Cross-org busy windows on the stations this caller can see.",
        "tags": [
          "Stations"
        ]
      }
    },
    "/api/v1/stations/{station_id}": {
      "get": {
        "description": "The same record `GET /stations` returns, for one station.\n\nAddressed by UUID. A station the caller cannot reach is 404, not 403:\nwhether it exists is not theirs to learn.\n\n`telemetry` follows the same rule as in the list: present only while your\norganization holds the antenna, or for an administrator. For a live read\nof what the modem itself reports, use\n`GET /stations/{station_id}/readings/{reading}`.",
        "operationId": "getStation",
        "parameters": [
          {
            "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
            "in": "path",
            "name": "station_id",
            "required": true,
            "schema": {
              "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
              "format": "uuid",
              "title": "Station Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_StationOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "One ground station.",
        "tags": [
          "Stations"
        ]
      }
    },
    "/api/v1/stations/{station_id}/mission-fields": {
      "get": {
        "description": "The one description of what may be set on this station.\n\nRender from this rather than from a built-in schema: a field list compiled\ninto a client is a guess about a modem it has never met, and it goes stale\nthe first time a station is upgraded.\n\n`value` is what the modem held when it was last read (`read_at`), so a form\ncan show current state without a second call.",
        "operationId": "listStationMissionFields",
        "parameters": [
          {
            "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
            "in": "path",
            "name": "station_id",
            "required": true,
            "schema": {
              "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
              "format": "uuid",
              "title": "Station Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_MissionFieldList_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Every mission field this station's modem exposes.",
        "tags": [
          "Missions"
        ]
      }
    },
    "/api/v1/stations/{station_id}/readings/{reading}": {
      "get": {
        "description": "Read-only, and only these readings.\n\nUmoja borrows a station for a pass and hands it back as it found it, so\nnothing here writes. Everything that does change a modem goes through the\npass lifecycle, which records the change and reverses it afterwards.\n\nThe answer is whatever the modem said, unaltered, under `data.result`.\nits shape is the vendor's and differs per reading, so it is not modelled\nhere. `data.ok` says whether the modem answered at all.\n\nReach is not the gate for all of them. Reaching a station means being\nallowed to book it; it does not mean being allowed to watch whoever has\nit, so the readings fall into three tiers:\n\n| Reading | Who may read it |\n| --- | --- |\n| `location`, `system`, `tle-settings` | anyone who can reach the station |\n| `antenna`, `antenna-position`, `radio`, `mission-config` | only while holding the station on an active pass (admins exempt) |\n| `tracking`, `passes` | admins only |\n\nThe middle tier is gated because a shared dish is reachable by several\norganisations and held by one at a time: where it points, what the SDR is\ntuned to and which mission is loaded all describe whoever's pass is\nrunning. The last tier answers for every organisation sharing the modem\nand has no per-caller version. For the caller's own fleet use\n`GET /satellites`, for the schedule with identities redacted use\n`GET /stations/booking-windows`.",
        "operationId": "getStationReading",
        "parameters": [
          {
            "in": "path",
            "name": "reading",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/StationReading"
            }
          },
          {
            "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
            "in": "path",
            "name": "station_id",
            "required": true,
            "schema": {
              "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
              "format": "uuid",
              "title": "Station Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_CommandResult_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "A live read from the station's modem.",
        "tags": [
          "Stations"
        ]
      }
    },
    "/api/v1/stations/{station_id}/satellite-defaults/{satellite_id}": {
      "get": {
        "description": "Seed a pass form from this, not from the live transceiver.\n\nA pass's defaults belong to the SATELLITE. A station keeps a per-satellite\nconfiguration and applies it at AOS itself. For Expedite that is the `.exp`\nmission file `/missions/getconfig` assigns, so that is what the satellite\nnormally flies on. The live `/trx` read is whatever the previous pass left\nbehind, which is a different question with a plausible-looking answer.\n\n`supported: false` means this station cannot answer (its vendor has no\nsuch configuration, or its agent is too old). Fall back to the live read\nthen, and say which one is on screen. Do not pass one off as the other.",
        "operationId": "getStationSatelliteDefaults",
        "parameters": [
          {
            "in": "path",
            "name": "satellite_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Satellite Id",
              "type": "string"
            }
          },
          {
            "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
            "in": "path",
            "name": "station_id",
            "required": true,
            "schema": {
              "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
              "format": "uuid",
              "title": "Station Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_StationDefaultsOut_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "What this station's own configuration says a satellite flies on.",
        "tags": [
          "Missions"
        ]
      }
    },
    "/api/v1/stations/{station_id}/transceiver": {
      "get": {
        "description": "What the radio is tuned to right now, read from the modem.\n\n**Only while you hold the antenna.** The modem's current settings belong\nto whatever pass is running, so reaching the station is not enough: a\nshared dish is reachable by several organizations and held by one at a\ntime. Without an active booking this is 409\n`station_not_permitted`; administrators are exempt.\n\nThe modem's own answer comes back verbatim under `data`. Its shape is\nthe vendor's, not Umoja's, and `ok` says whether the modem answered at\nall. `editable_fields` lists which of this station's settings this caller\nmay change, so an editor can be built before a pass exists to ask about.\n\nChange them with `PATCH /stations/{station_id}/transceiver`. 409\n`station_offline` means no agent is connected; 504 means the station was\nconnected but did not answer; 502 means the modem rejected the read.",
        "operationId": "getStationTransceiver",
        "parameters": [
          {
            "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
            "in": "path",
            "name": "station_id",
            "required": true,
            "schema": {
              "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
              "format": "uuid",
              "title": "Station Id",
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_CommandResult_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Current transceiver settings from the modem.",
        "tags": [
          "Stations"
        ]
      },
      "patch": {
        "description": "Only during a pass the caller holds.\n\n`requires_pass` refuses `409 station_not_permitted` before anything is\ndispatched, and the agent refuses independently when no pass is active,\nUmoja hands a station back as it found it, and a tune with no pass around\nit has no postprocess to undo it. The two checks can disagree for the\nwidth of a LOS, and the agent's refusal is the authoritative one.",
        "operationId": "patchStationTransceiver",
        "parameters": [
          {
            "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
            "in": "path",
            "name": "station_id",
            "required": true,
            "schema": {
              "description": "The station's UUID, as `GET /stations` reports it. An unknown one is reported as 404, the same answer an unreachable station gives.",
              "format": "uuid",
              "title": "Station Id",
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransceiverPatch"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_CommandResult_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Validation Error",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "Live transceiver tuning. Applies immediately, with no pass time-lock.",
        "tags": [
          "Stations"
        ]
      }
    },
    "/api/v1/system-status": {
      "get": {
        "description": "The hub's own health, plus the caller's slice of the fleet.\n\nThe station and pass counts are SCOPED: `stations_total` and\n`stations_online` count only stations the caller can reach, and the pass\ncounts only the caller's own organization's bookings. It is not a\nfleet-wide census, so two organizations on the same hub see different\nnumbers. An administrator sees everything.\n\n`services` reports each dependency separately (database, redis,\nobject-storage, agents), and a failing one does NOT fail this request.\nThat is deliberate: the point is to say WHICH part is down, and a 503\ncannot. When the database probe fails, the counts above it are 0 rather\nthan absent; read `services` before trusting a zero.\n\n`now` is the hub's clock, for a client that wants to render times\nrelative to the server instead of the browser. For plain liveness use\n`GET /health`, which is unversioned and needs no credential.",
        "operationId": "getSystemStatus",
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope_SystemStatus_"
                }
              }
            },
            "description": "Successful Response",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Malformed request, for example an unreadable pagination cursor.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No bearer token, or the token could not be verified.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "403": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Authenticated, but not permitted: a missing role, a resource another organization owns, or a field this organization may not set.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "No such resource, or one the caller may not reach. The two are deliberately indistinguishable, so an id cannot be probed for existence.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "409": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request conflicts with current state: a slot already booked, a locked pass, an offline station.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "The request body or parameters failed validation.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Rate limited. Retry after the `Retry-After` header.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "500": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "Unexpected server fault. `request_id` identifies it in the hub's logs.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "502": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency answered but could not be understood, typically the identity provider or a station agent.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "503": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            },
            "description": "A dependency this call needs is unavailable or unconfigured: object storage, share links, or the identity provider.",
            "headers": {
              "X-Request-ID": {
                "description": "Correlation id for this request. Quote it when reporting a problem. Echoed from the request's own `X-Request-ID` when one was sent.",
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        },
        "summary": "What the portal needs to render its status bar.",
        "tags": [
          "System"
        ]
      }
    }
  },
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "tags": [
    {
      "description": "Who the caller is, and which organization they act for.",
      "name": "Identity"
    },
    {
      "description": "Your own organization: its members, its API client, and rotating that client's secret.",
      "name": "Organizations"
    },
    {
      "description": "The spacecraft you operate, their orbital elements, and which stations track them.",
      "name": "Satellites"
    },
    {
      "description": "Umoja's mirror of the public catalogue, for finding an object by name or NORAD number when registering it.",
      "name": "CelesTrak"
    },
    {
      "description": "Ground stations you can reach: their capabilities, live telemetry while you hold the antenna, and the transceiver.",
      "name": "Stations"
    },
    {
      "description": "Predicted contact windows, their availability, and why one is unavailable.",
      "name": "Passes"
    },
    {
      "description": "Reserving a pass and releasing it, plus everything hanging off a reservation: mission parameters, the recorder, and its activity log.",
      "name": "Bookings"
    },
    {
      "description": "Mission-parameter templates and the per-station field catalogue they are written against.",
      "name": "Missions"
    },
    {
      "description": "Mission files downlinked during a pass, and shareable download links for them.",
      "name": "Files"
    },
    {
      "description": "Archived RF and TT&C streams from a pass that has flown.",
      "name": "Replay"
    },
    {
      "description": "Events addressed to you: a station going offline, a pass trimmed, elements diverging.",
      "name": "Notifications"
    },
    {
      "description": "Operator-wide notices and release notes, published by Umoja.",
      "name": "Announcements"
    },
    {
      "description": "Hub health and the counts scoped to your own fleet.",
      "name": "System"
    }
  ]
}