{
 "components": {
  "schemas": {
   "AcceptBody": {
    "additionalProperties": false,
    "properties": {
     "full_name": {
      "default": "",
      "maxLength": 200,
      "title": "Full Name",
      "type": "string"
     },
     "password": {
      "maxLength": 1024,
      "title": "Password",
      "type": "string"
     },
     "token": {
      "maxLength": 256,
      "minLength": 1,
      "title": "Token",
      "type": "string"
     }
    },
    "required": [
     "token",
     "password"
    ],
    "title": "AcceptBody",
    "type": "object"
   },
   "AccountObject": {
    "additionalProperties": false,
    "description": "``SPEC`` §11.2. ``first_name`` and ``last_name`` are the existing ``accounts.firstname`` /\n``lastname`` columns; ``name`` is the derived display string and is read-only.",
    "properties": {
     "can_create_child_accounts": {
      "title": "Can Create Child Accounts",
      "type": "boolean"
     },
     "child_account_count": {
      "title": "Child Account Count",
      "type": "integer"
     },
     "created_at": {
      "title": "Created At",
      "type": "string"
     },
     "creator_ref": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Creator Ref"
     },
     "default_expire_after_sec": {
      "title": "Default Expire After Sec",
      "type": "integer"
     },
     "email": {
      "description": "The account's contact address, not a console user's sign-in address.",
      "title": "Email",
      "type": "string"
     },
     "first_name": {
      "title": "First Name",
      "type": "string"
     },
     "fit_to_page_default": {
      "title": "Fit To Page Default",
      "type": "string"
     },
     "id": {
      "title": "Id",
      "type": "string"
     },
     "last_name": {
      "title": "Last Name",
      "type": "string"
     },
     "name": {
      "description": "`first_name` and `last_name` joined with a space; read-only.",
      "title": "Name",
      "type": "string"
     },
     "parent_account_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Parent Account Id"
     },
     "parent_email": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Parent Email"
     },
     "state": {
      "title": "State",
      "type": "string"
     },
     "tags": {
      "additionalProperties": {
       "type": "string"
      },
      "description": "Always an object; `{}` when the account has no tags.",
      "title": "Tags",
      "type": "object"
     },
     "updated_at": {
      "title": "Updated At",
      "type": "string"
     }
    },
    "required": [
     "id",
     "first_name",
     "last_name",
     "name",
     "email",
     "state",
     "parent_account_id",
     "parent_email",
     "creator_ref",
     "can_create_child_accounts",
     "child_account_count",
     "default_expire_after_sec",
     "fit_to_page_default",
     "tags",
     "created_at",
     "updated_at"
    ],
    "title": "AccountObject",
    "type": "object"
   },
   "AgentKeyBody": {
    "additionalProperties": false,
    "properties": {
     "computer_name": {
      "anyOf": [
       {
        "maxLength": 200,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Computer Name"
     },
     "edition": {
      "default": "printhook",
      "maxLength": 64,
      "title": "Edition",
      "type": "string"
     },
     "email": {
      "title": "Email",
      "type": "string"
     },
     "hostname": {
      "anyOf": [
       {
        "maxLength": 200,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Hostname"
     },
     "install_uuid": {
      "title": "Install Uuid",
      "type": "string"
     },
     "mfa_code": {
      "anyOf": [
       {
        "maxLength": 64,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Mfa Code"
     },
     "os": {
      "anyOf": [
       {
        "maxLength": 64,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Os"
     },
     "password": {
      "maxLength": 1024,
      "title": "Password",
      "type": "string"
     },
     "station": {
      "anyOf": [
       {
        "maxLength": 64,
        "minLength": 1,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Station"
     },
     "version": {
      "default": "",
      "maxLength": 64,
      "title": "Version",
      "type": "string"
     }
    },
    "required": [
     "email",
     "password",
     "install_uuid"
    ],
    "title": "AgentKeyBody",
    "type": "object"
   },
   "AgentKeyResponse": {
    "description": "Enrollment result. The nullable endpoint never replaces the HTTP API base.",
    "properties": {
     "account_id": {
      "title": "Account Id",
      "type": "string"
     },
     "agent_websocket_url": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Agent Websocket Url"
     },
     "computer_key": {
      "title": "Computer Key",
      "type": "string"
     },
     "email": {
      "title": "Email",
      "type": "string"
     },
     "install_uuid": {
      "title": "Install Uuid",
      "type": "string"
     },
     "station_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Station Id"
     },
     "station_name": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Station Name"
     }
    },
    "required": [
     "computer_key",
     "account_id",
     "install_uuid",
     "email",
     "agent_websocket_url"
    ],
    "title": "AgentKeyResponse",
    "type": "object"
   },
   "AgentRelease": {
    "additionalProperties": false,
    "description": "``SPEC.md`` §11.7. ``version``, ``filename`` and ``sha256`` are byte-identical to storage: they\nare the ed25519 signed message the agent verifies, so nothing normalizes them.",
    "properties": {
     "arch": {
      "title": "Arch",
      "type": "string"
     },
     "channel": {
      "title": "Channel",
      "type": "string"
     },
     "edition": {
      "title": "Edition",
      "type": "string"
     },
     "enabled": {
      "title": "Enabled",
      "type": "boolean"
     },
     "filename": {
      "title": "Filename",
      "type": "string"
     },
     "id": {
      "title": "Id",
      "type": "string"
     },
     "kind": {
      "description": "`archive`: the zip / tar.gz the self-updater unpacks. `installer`: the .msi, .pkg, .deb or .rpm a person downloads.",
      "title": "Kind",
      "type": "string"
     },
     "os": {
      "title": "Os",
      "type": "string"
     },
     "released_at": {
      "title": "Released At",
      "type": "string"
     },
     "sha1": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Sha1"
     },
     "sha256": {
      "title": "Sha256",
      "type": "string"
     },
     "signature": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "Detached ed25519 signature; null until a key is published.",
      "title": "Signature"
     },
     "size_bytes": {
      "description": "The download's size in bytes (`filesize` before this cut).",
      "title": "Size Bytes",
      "type": "integer"
     },
     "url": {
      "description": "The binary download. Not a PrintHook API route and not credentialed.",
      "title": "Url",
      "type": "string"
     },
     "version": {
      "title": "Version",
      "type": "string"
     }
    },
    "required": [
     "id",
     "edition",
     "version",
     "os",
     "arch",
     "channel",
     "kind",
     "enabled",
     "filename",
     "size_bytes",
     "sha1",
     "sha256",
     "signature",
     "url",
     "released_at"
    ],
    "title": "AgentRelease",
    "type": "object"
   },
   "AuditEntry": {
    "additionalProperties": false,
    "properties": {
     "account_id": {
      "title": "Account Id",
      "type": "string"
     },
     "action": {
      "title": "Action",
      "type": "string"
     },
     "actor_api_key_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Actor Api Key Id"
     },
     "actor_user_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Actor User Id"
     },
     "created_at": {
      "title": "Created At",
      "type": "string"
     },
     "id": {
      "title": "Id",
      "type": "string"
     },
     "ip": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Ip"
     },
     "meta": {
      "additionalProperties": true,
      "title": "Meta",
      "type": "object"
     },
     "object_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Object Id"
     },
     "object_type": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Object Type"
     }
    },
    "required": [
     "id",
     "account_id",
     "actor_user_id",
     "actor_api_key_id",
     "action",
     "object_type",
     "object_id",
     "ip",
     "meta",
     "created_at"
    ],
    "title": "AuditEntry",
    "type": "object"
   },
   "BillingSummary": {
    "properties": {
     "can_manage": {
      "title": "Can Manage",
      "type": "boolean"
     },
     "cancel_at_period_end": {
      "title": "Cancel At Period End",
      "type": "boolean"
     },
     "configured": {
      "title": "Configured",
      "type": "boolean"
     },
     "current_period_end": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Current Period End"
     },
     "enabled": {
      "title": "Enabled",
      "type": "boolean"
     },
     "has_customer": {
      "title": "Has Customer",
      "type": "boolean"
     },
     "mode": {
      "enum": [
       "stripe",
       "trial_only"
      ],
      "title": "Mode",
      "type": "string"
     },
     "period": {
      "title": "Period",
      "type": "string"
     },
     "plan": {
      "title": "Plan",
      "type": "string"
     },
     "plans": {
      "items": {
       "additionalProperties": true,
       "type": "object"
      },
      "title": "Plans",
      "type": "array"
     },
     "print_limit": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Print Limit"
     },
     "prints_used": {
      "title": "Prints Used",
      "type": "integer"
     },
     "status": {
      "title": "Status",
      "type": "string"
     },
     "trial": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/TrialMetadata"
       },
       {
        "type": "null"
       }
      ]
     }
    },
    "required": [
     "enabled",
     "configured",
     "mode",
     "trial",
     "plan",
     "status",
     "period",
     "prints_used",
     "print_limit",
     "can_manage",
     "has_customer",
     "cancel_at_period_end",
     "current_period_end",
     "plans"
    ],
    "title": "BillingSummary",
    "type": "object"
   },
   "BindBody": {
    "additionalProperties": false,
    "properties": {
     "device_id": {
      "description": "A `prn_` id for `label`/`slip`, a `dev_` id for `scale`.",
      "title": "Device Id",
      "type": "string"
     }
    },
    "required": [
     "device_id"
    ],
    "title": "BindBody",
    "type": "object"
   },
   "BulkCancelBody": {
    "additionalProperties": false,
    "properties": {
     "all": {
      "anyOf": [
       {
        "type": "boolean"
       },
       {
        "type": "null"
       }
      ],
      "title": "All"
     },
     "confirm_count": {
      "anyOf": [
       {
        "minimum": 0.0,
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Confirm Count"
     },
     "dry_run": {
      "default": false,
      "title": "Dry Run",
      "type": "boolean"
     },
     "filter": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/BulkCancelFilter"
       },
       {
        "type": "null"
       }
      ]
     },
     "ids": {
      "anyOf": [
       {
        "items": {
         "type": "string"
        },
        "type": "array"
       },
       {
        "type": "null"
       }
      ],
      "title": "Ids"
     }
    },
    "title": "BulkCancelBody",
    "type": "object"
   },
   "BulkCancelFilter": {
    "additionalProperties": false,
    "description": "Exactly the filter names of ``GET /v1/jobs`` (``SPEC`` §5.6), and no others.",
    "properties": {
     "computer_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Computer Id"
     },
     "created_after": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Created After"
     },
     "created_before": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Created Before"
     },
     "printer_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Printer Id"
     },
     "source": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Source"
     },
     "station_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Station Id"
     },
     "status": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Status"
     }
    },
    "title": "BulkCancelFilter",
    "type": "object"
   },
   "BulkDelete": {
    "additionalProperties": true,
    "description": "The bulk grammar of §5.6: exactly one of ``ids``, ``filter``, ``all``.\n\n``strict`` is what makes ``{\"all\": \"true\"}`` a refusal rather than a fleet-wide delete: the lenient\nscalar coercion that existed for form-encoded bodies is deleted (§4, §6.2), and a destructive verb\nis the last place to be guessing what a string meant. Extra members are read back out in the route\nand refused by name, so a typo in a member is never silently ignored.",
    "properties": {
     "all": {
      "anyOf": [
       {
        "type": "boolean"
       },
       {
        "type": "null"
       }
      ],
      "title": "All"
     },
     "confirm_count": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "description": "Required with `filter` or `all`, and compared against the whole selection before anything is written.",
      "title": "Confirm Count"
     },
     "dry_run": {
      "default": false,
      "title": "Dry Run",
      "type": "boolean"
     },
     "filter": {
      "anyOf": [
       {
        "additionalProperties": true,
        "type": "object"
       },
       {
        "type": "null"
       }
      ],
      "title": "Filter"
     },
     "ids": {
      "anyOf": [
       {
        "items": {
         "type": "string"
        },
        "type": "array"
       },
       {
        "type": "null"
       }
      ],
      "title": "Ids"
     }
    },
    "title": "BulkDelete",
    "type": "object"
   },
   "BulkItemResult": {
    "additionalProperties": false,
    "description": "One row's outcome.\n\n``unchanged`` is the answer for a row the operation legitimately did not apply to — an\nalready-delivered job — which a bare array of ids can only express by silently omitting it.",
    "properties": {
     "code": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "An error-catalog code for `unchanged` and `error`; else null.",
      "title": "Code"
     },
     "id": {
      "title": "Id",
      "type": "string"
     },
     "message": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "Prose for a human; null on `ok`.",
      "title": "Message"
     },
     "status": {
      "enum": [
       "ok",
       "unchanged",
       "error"
      ],
      "title": "Status",
      "type": "string"
     }
    },
    "required": [
     "id",
     "status",
     "code",
     "message"
    ],
    "title": "BulkItemResult",
    "type": "object"
   },
   "BulkResult": {
    "additionalProperties": false,
    "properties": {
     "results": {
      "items": {
       "$ref": "#/components/schemas/BulkItemResult"
      },
      "title": "Results",
      "type": "array"
     },
     "summary": {
      "$ref": "#/components/schemas/BulkSummary"
     }
    },
    "required": [
     "results",
     "summary"
    ],
    "title": "BulkResult",
    "type": "object"
   },
   "BulkSummary": {
    "additionalProperties": false,
    "description": "``ok + unchanged + error`` is the number of rows **this call** reached.\n\n``actual_count`` is the pre-execution size of the whole selection, which is what ``confirm_count``\nis compared against; when it exceeds the per-call row cap, ``has_more`` is true and the caller\nloops, re-reading ``actual_count`` with ``dry_run`` because the selection shrinks as it goes.",
    "properties": {
     "actual_count": {
      "title": "Actual Count",
      "type": "integer"
     },
     "dry_run": {
      "title": "Dry Run",
      "type": "boolean"
     },
     "error": {
      "title": "Error",
      "type": "integer"
     },
     "has_more": {
      "title": "Has More",
      "type": "boolean"
     },
     "ok": {
      "title": "Ok",
      "type": "integer"
     },
     "requested": {
      "title": "Requested",
      "type": "integer"
     },
     "unchanged": {
      "title": "Unchanged",
      "type": "integer"
     }
    },
    "required": [
     "requested",
     "ok",
     "unchanged",
     "error",
     "dry_run",
     "has_more",
     "actual_count"
    ],
    "title": "BulkSummary",
    "type": "object"
   },
   "ChangeBody": {
    "additionalProperties": false,
    "properties": {
     "code": {
      "maxLength": 64,
      "minLength": 1,
      "title": "Code",
      "type": "string"
     },
     "current_password": {
      "maxLength": 1024,
      "title": "Current Password",
      "type": "string"
     }
    },
    "required": [
     "code",
     "current_password"
    ],
    "title": "ChangeBody",
    "type": "object"
   },
   "ChangeEmailBody": {
    "additionalProperties": false,
    "properties": {
     "current_password": {
      "anyOf": [
       {
        "maxLength": 1024,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Current Password"
     },
     "mfa_code": {
      "anyOf": [
       {
        "maxLength": 64,
        "minLength": 1,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Mfa Code"
     },
     "new_email": {
      "title": "New Email",
      "type": "string"
     }
    },
    "required": [
     "new_email"
    ],
    "title": "ChangeEmailBody",
    "type": "object"
   },
   "ChangePasswordBody": {
    "additionalProperties": false,
    "properties": {
     "current_password": {
      "anyOf": [
       {
        "maxLength": 1024,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Current Password"
     },
     "mfa_code": {
      "anyOf": [
       {
        "maxLength": 64,
        "minLength": 1,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Mfa Code"
     },
     "new_password": {
      "maxLength": 1024,
      "title": "New Password",
      "type": "string"
     }
    },
    "required": [
     "new_password"
    ],
    "title": "ChangePasswordBody",
    "type": "object"
   },
   "CheckoutBody": {
    "additionalProperties": false,
    "properties": {
     "plan": {
      "title": "Plan",
      "type": "string"
     }
    },
    "required": [
     "plan"
    ],
    "title": "CheckoutBody",
    "type": "object"
   },
   "CodeBody": {
    "additionalProperties": false,
    "properties": {
     "code": {
      "maxLength": 64,
      "minLength": 1,
      "title": "Code",
      "type": "string"
     }
    },
    "required": [
     "code"
    ],
    "title": "CodeBody",
    "type": "object"
   },
   "Collection_AccountObject_": {
    "additionalProperties": false,
    "properties": {
     "data": {
      "items": {
       "$ref": "#/components/schemas/AccountObject"
      },
      "title": "Data",
      "type": "array"
     },
     "page": {
      "$ref": "#/components/schemas/Page"
     }
    },
    "required": [
     "data",
     "page"
    ],
    "title": "Collection[AccountObject]",
    "type": "object"
   },
   "Collection_AgentRelease_": {
    "additionalProperties": false,
    "properties": {
     "data": {
      "items": {
       "$ref": "#/components/schemas/AgentRelease"
      },
      "title": "Data",
      "type": "array"
     },
     "page": {
      "$ref": "#/components/schemas/Page"
     }
    },
    "required": [
     "data",
     "page"
    ],
    "title": "Collection[AgentRelease]",
    "type": "object"
   },
   "Collection_AuditEntry_": {
    "additionalProperties": false,
    "properties": {
     "data": {
      "items": {
       "$ref": "#/components/schemas/AuditEntry"
      },
      "title": "Data",
      "type": "array"
     },
     "page": {
      "$ref": "#/components/schemas/Page"
     }
    },
    "required": [
     "data",
     "page"
    ],
    "title": "Collection[AuditEntry]",
    "type": "object"
   },
   "Collection_Computer_": {
    "additionalProperties": false,
    "properties": {
     "data": {
      "items": {
       "$ref": "#/components/schemas/Computer"
      },
      "title": "Data",
      "type": "array"
     },
     "page": {
      "$ref": "#/components/schemas/Page"
     }
    },
    "required": [
     "data",
     "page"
    ],
    "title": "Collection[Computer]",
    "type": "object"
   },
   "Collection_Device_": {
    "additionalProperties": false,
    "properties": {
     "data": {
      "items": {
       "$ref": "#/components/schemas/Device"
      },
      "title": "Data",
      "type": "array"
     },
     "page": {
      "$ref": "#/components/schemas/Page"
     }
    },
    "required": [
     "data",
     "page"
    ],
    "title": "Collection[Device]",
    "type": "object"
   },
   "Collection_Key_": {
    "additionalProperties": false,
    "properties": {
     "data": {
      "items": {
       "$ref": "#/components/schemas/Key"
      },
      "title": "Data",
      "type": "array"
     },
     "page": {
      "$ref": "#/components/schemas/Page"
     }
    },
    "required": [
     "data",
     "page"
    ],
    "title": "Collection[Key]",
    "type": "object"
   },
   "Collection_Printer_": {
    "additionalProperties": false,
    "properties": {
     "data": {
      "items": {
       "$ref": "#/components/schemas/Printer"
      },
      "title": "Data",
      "type": "array"
     },
     "page": {
      "$ref": "#/components/schemas/Page"
     }
    },
    "required": [
     "data",
     "page"
    ],
    "title": "Collection[Printer]",
    "type": "object"
   },
   "Collection_StationObject_": {
    "additionalProperties": false,
    "properties": {
     "data": {
      "items": {
       "$ref": "#/components/schemas/StationObject"
      },
      "title": "Data",
      "type": "array"
     },
     "page": {
      "$ref": "#/components/schemas/Page"
     }
    },
    "required": [
     "data",
     "page"
    ],
    "title": "Collection[StationObject]",
    "type": "object"
   },
   "Collection_WebhookDelivery_": {
    "additionalProperties": false,
    "properties": {
     "data": {
      "items": {
       "$ref": "#/components/schemas/WebhookDelivery"
      },
      "title": "Data",
      "type": "array"
     },
     "page": {
      "$ref": "#/components/schemas/Page"
     }
    },
    "required": [
     "data",
     "page"
    ],
    "title": "Collection[WebhookDelivery]",
    "type": "object"
   },
   "Collection_dict_str__Any__": {
    "additionalProperties": false,
    "properties": {
     "data": {
      "items": {
       "additionalProperties": true,
       "type": "object"
      },
      "title": "Data",
      "type": "array"
     },
     "page": {
      "$ref": "#/components/schemas/Page"
     }
    },
    "required": [
     "data",
     "page"
    ],
    "title": "Collection[dict[str, Any]]",
    "type": "object"
   },
   "Computer": {
    "additionalProperties": false,
    "description": "``SPEC.md`` §11.4. Everything but ``deleted_at`` is agent-written; the API writes nothing on a\ncomputer except that one column, because the agent owns the rest.",
    "properties": {
     "agent_version": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "`version` before this cut.",
      "title": "Agent Version"
     },
     "arch": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Arch"
     },
     "connected_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "When the current connection began.",
      "title": "Connected At"
     },
     "created_at": {
      "title": "Created At",
      "type": "string"
     },
     "deleted_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "Present and null everywhere but the `DELETE` response, which is the one place a retired computer is rendered at all.",
      "title": "Deleted At"
     },
     "edition": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Edition"
     },
     "hostname": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Hostname"
     },
     "id": {
      "title": "Id",
      "type": "string"
     },
     "inet": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Inet"
     },
     "inet6": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Inet6"
     },
     "install_uuid": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Install Uuid"
     },
     "last_seen_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Last Seen At"
     },
     "name": {
      "title": "Name",
      "type": "string"
     },
     "os": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Os"
     },
     "os_version": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Os Version"
     },
     "printer_count": {
      "title": "Printer Count",
      "type": "integer"
     },
     "printer_online_count": {
      "title": "Printer Online Count",
      "type": "integer"
     },
     "status": {
      "description": "`connected` or `disconnected`. A row never holds `simulated`.",
      "title": "Status",
      "type": "string"
     },
     "update_channel": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Update Channel"
     },
     "updated_at": {
      "title": "Updated At",
      "type": "string"
     }
    },
    "required": [
     "id",
     "name",
     "hostname",
     "status",
     "install_uuid",
     "agent_version",
     "edition",
     "os",
     "os_version",
     "arch",
     "inet",
     "inet6",
     "update_channel",
     "last_seen_at",
     "connected_at",
     "printer_count",
     "printer_online_count",
     "deleted_at",
     "created_at",
     "updated_at"
    ],
    "title": "Computer",
    "type": "object"
   },
   "ComputerRetireResult": {
    "additionalProperties": false,
    "description": "The composite of §6.1. The computer object inside it is identical to the one every other route\nreturns; ``status`` stays `disconnected` and ``deleted_at`` is what says the computer is gone.",
    "properties": {
     "computer": {
      "$ref": "#/components/schemas/Computer"
     },
     "retired_printer_ids": {
      "items": {
       "type": "string"
      },
      "title": "Retired Printer Ids",
      "type": "array"
     }
    },
    "required": [
     "computer",
     "retired_printer_ids"
    ],
    "title": "ComputerRetireResult",
    "type": "object"
   },
   "ComputerTotals": {
    "additionalProperties": false,
    "properties": {
     "connected": {
      "title": "Connected",
      "type": "integer"
     },
     "total": {
      "title": "Total",
      "type": "integer"
     }
    },
    "required": [
     "total",
     "connected"
    ],
    "title": "ComputerTotals",
    "type": "object"
   },
   "Counters": {
    "additionalProperties": false,
    "description": "Metered counters are rows in a map, not routes: a future counter is a new member here.",
    "properties": {
     "jobs": {
      "title": "Jobs",
      "type": "integer"
     },
     "prints": {
      "title": "Prints",
      "type": "integer"
     }
    },
    "required": [
     "prints",
     "jobs"
    ],
    "title": "Counters",
    "type": "object"
   },
   "CreateJobBody": {
    "additionalProperties": false,
    "description": "The target is ``printer_id`` **or** ``station_id`` + ``role``, never both: a station resolves\nits role to a printer at submit time, so a job addressed both ways could disagree with itself.",
    "properties": {
     "content": {
      "$ref": "#/components/schemas/JobContent"
     },
     "copies": {
      "default": 1,
      "maximum": 999.0,
      "minimum": 1.0,
      "title": "Copies",
      "type": "integer"
     },
     "expires_in_sec": {
      "anyOf": [
       {
        "maximum": 31536000.0,
        "minimum": 60.0,
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Expires In Sec"
     },
     "options": {
      "additionalProperties": true,
      "title": "Options",
      "type": "object"
     },
     "printer_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Printer Id"
     },
     "quantity": {
      "default": 1,
      "maximum": 1000.0,
      "minimum": 1.0,
      "title": "Quantity",
      "type": "integer"
     },
     "role": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Role"
     },
     "source": {
      "default": "",
      "title": "Source",
      "type": "string"
     },
     "station_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Station Id"
     },
     "title": {
      "default": "",
      "title": "Title",
      "type": "string"
     }
    },
    "required": [
     "content"
    ],
    "title": "CreateJobBody",
    "type": "object"
   },
   "CreateStationBody": {
    "additionalProperties": false,
    "properties": {
     "computer_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Computer Id"
     },
     "name": {
      "maxLength": 120,
      "title": "Name",
      "type": "string"
     },
     "tags": {
      "anyOf": [
       {
        "items": {
         "type": "string"
        },
        "type": "array"
       },
       {
        "type": "null"
       }
      ],
      "title": "Tags"
     }
    },
    "required": [
     "name"
    ],
    "title": "CreateStationBody",
    "type": "object"
   },
   "Device": {
    "additionalProperties": false,
    "description": "``SPEC.md`` §12.8.",
    "properties": {
     "computer": {
      "$ref": "#/components/schemas/printhook_server__v1__routers__devices__ComputerRef"
     },
     "device_name": {
      "title": "Device Name",
      "type": "string"
     },
     "device_num": {
      "title": "Device Num",
      "type": "integer"
     },
     "first_seen_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "First Seen At"
     },
     "id": {
      "title": "Id",
      "type": "string"
     },
     "kind": {
      "title": "Kind",
      "type": "string"
     },
     "last_seen_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Last Seen At"
     },
     "port": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Port"
     },
     "product": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Product"
     },
     "product_id": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Product Id"
     },
     "reading": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Reading"
       },
       {
        "type": "null"
       }
      ]
     },
     "registered": {
      "description": "False for a reading the device registry does not know.",
      "title": "Registered",
      "type": "boolean"
     },
     "status": {
      "description": "`reporting`, `silent` or `retired`.",
      "title": "Status",
      "type": "string"
     },
     "vendor": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Vendor"
     },
     "vendor_id": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Vendor Id"
     }
    },
    "required": [
     "id",
     "kind",
     "status",
     "registered",
     "device_name",
     "device_num",
     "computer",
     "vendor",
     "product",
     "vendor_id",
     "product_id",
     "port",
     "first_seen_at",
     "last_seen_at",
     "reading"
    ],
    "title": "Device",
    "type": "object"
   },
   "DeviceReadingEnvelope": {
    "additionalProperties": false,
    "description": "The composite of §6.1. It is never a bare object and never a bare ``null``, which is what lets\n``reading`` be present-and-null and gives a future member somewhere to live.",
    "properties": {
     "device_id": {
      "title": "Device Id",
      "type": "string"
     },
     "reading": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/Reading"
       },
       {
        "type": "null"
       }
      ]
     }
    },
    "required": [
     "device_id",
     "reading"
    ],
    "title": "DeviceReadingEnvelope",
    "type": "object"
   },
   "EmailBody": {
    "additionalProperties": false,
    "properties": {
     "email": {
      "title": "Email",
      "type": "string"
     }
    },
    "required": [
     "email"
    ],
    "title": "EmailBody",
    "type": "object"
   },
   "EmptyBody": {
    "additionalProperties": false,
    "properties": {},
    "title": "EmptyBody",
    "type": "object"
   },
   "HTTPValidationError": {
    "properties": {
     "detail": {
      "items": {
       "$ref": "#/components/schemas/ValidationError"
      },
      "title": "Detail",
      "type": "array"
     }
    },
    "title": "HTTPValidationError",
    "type": "object"
   },
   "InviteBody": {
    "additionalProperties": false,
    "properties": {
     "email": {
      "maxLength": 254,
      "title": "Email",
      "type": "string"
     },
     "role": {
      "enum": [
       "admin",
       "operator",
       "viewer"
      ],
      "title": "Role",
      "type": "string"
     }
    },
    "required": [
     "email",
     "role"
    ],
    "title": "InviteBody",
    "type": "object"
   },
   "JobAuth": {
    "additionalProperties": false,
    "description": "Credentials for a ``url`` fetch, sealed at rest and unsealed only when a frame is built.",
    "properties": {
     "password": {
      "title": "Password",
      "type": "string"
     },
     "scheme": {
      "enum": [
       "basic",
       "digest"
      ],
      "title": "Scheme",
      "type": "string"
     },
     "username": {
      "title": "Username",
      "type": "string"
     }
    },
    "required": [
     "scheme",
     "username",
     "password"
    ],
    "title": "JobAuth",
    "type": "object"
   },
   "JobContent": {
    "additionalProperties": false,
    "description": "One object where **exactly one** of ``data`` / ``url`` selects the delivery mode.\n\nThere is no ``encoding`` member: the member that is present already says how the bytes arrive, and\na second field would only create invalid combinations. ``type`` is never inferred.",
    "properties": {
     "auth": {
      "anyOf": [
       {
        "$ref": "#/components/schemas/JobAuth"
       },
       {
        "type": "null"
       }
      ]
     },
     "data": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Data"
     },
     "type": {
      "enum": [
       "pdf",
       "raw"
      ],
      "title": "Type",
      "type": "string"
     },
     "url": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Url"
     }
    },
    "required": [
     "type"
    ],
    "title": "JobContent",
    "type": "object"
   },
   "Key": {
    "additionalProperties": false,
    "description": "``SPEC`` §11.3. ``label`` is ``api_keys.description`` — the same column, renamed on the wire —\nand ``prefix`` is the eight stored characters the lookup path matches on, whatever the key's\nform.",
    "properties": {
     "created_at": {
      "title": "Created At",
      "type": "string"
     },
     "expires_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Expires At"
     },
     "id": {
      "title": "Id",
      "type": "string"
     },
     "install_uuid": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Install Uuid"
     },
     "kind": {
      "description": "`integration` or `computer`, derived from `scopes`.",
      "title": "Kind",
      "type": "string"
     },
     "label": {
      "description": "An attribute, not an identifier. A computer key renders its install.",
      "title": "Label",
      "type": "string"
     },
     "last_used_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Last Used At"
     },
     "last_used_ip": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Last Used Ip"
     },
     "prefix": {
      "description": "The first eight characters of the key, as stored.",
      "title": "Prefix",
      "type": "string"
     },
     "revoked_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Revoked At"
     },
     "scopes": {
      "items": {
       "type": "string"
      },
      "title": "Scopes",
      "type": "array"
     },
     "secret": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "The key itself, shown once by the two routes that mint one; null everywhere else.",
      "title": "Secret"
     }
    },
    "required": [
     "id",
     "kind",
     "label",
     "prefix",
     "scopes",
     "install_uuid",
     "created_at",
     "last_used_at",
     "last_used_ip",
     "expires_at",
     "revoked_at",
     "secret"
    ],
    "title": "Key",
    "type": "object"
   },
   "LoginBody": {
    "additionalProperties": false,
    "properties": {
     "email": {
      "title": "Email",
      "type": "string"
     },
     "mfa_code": {
      "anyOf": [
       {
        "maxLength": 64,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Mfa Code"
     },
     "password": {
      "maxLength": 1024,
      "title": "Password",
      "type": "string"
     }
    },
    "required": [
     "email",
     "password"
    ],
    "title": "LoginBody",
    "type": "object"
   },
   "LogoutAllBody": {
    "additionalProperties": false,
    "properties": {
     "keep_current": {
      "default": false,
      "title": "Keep Current",
      "type": "boolean"
     }
    },
    "title": "LogoutAllBody",
    "type": "object"
   },
   "MFASetup": {
    "properties": {
     "expires_at": {
      "title": "Expires At",
      "type": "string"
     },
     "otpauth_uri": {
      "title": "Otpauth Uri",
      "type": "string"
     },
     "secret": {
      "title": "Secret",
      "type": "string"
     }
    },
    "required": [
     "secret",
     "otpauth_uri",
     "expires_at"
    ],
    "title": "MFASetup",
    "type": "object"
   },
   "MFAStatus": {
    "properties": {
     "enabled": {
      "title": "Enabled",
      "type": "boolean"
     },
     "enabled_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Enabled At"
     },
     "pending_setup_expires_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Pending Setup Expires At"
     },
     "recovery_codes_remaining": {
      "title": "Recovery Codes Remaining",
      "type": "integer"
     }
    },
    "required": [
     "enabled",
     "enabled_at",
     "recovery_codes_remaining",
     "pending_setup_expires_at"
    ],
    "title": "MFAStatus",
    "type": "object"
   },
   "MemberBody": {
    "additionalProperties": false,
    "properties": {
     "is_active": {
      "anyOf": [
       {
        "type": "boolean"
       },
       {
        "type": "null"
       }
      ],
      "title": "Is Active"
     },
     "role": {
      "anyOf": [
       {
        "enum": [
         "admin",
         "operator",
         "viewer"
        ],
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Role"
     }
    },
    "title": "MemberBody",
    "type": "object"
   },
   "Page": {
    "additionalProperties": false,
    "description": "The nine members of a collection's ``page`` object, all of them always present.",
    "properties": {
     "has_more": {
      "description": "Whether a further page exists in the current direction.",
      "title": "Has More",
      "type": "boolean"
     },
     "limit": {
      "description": "The page size that was applied.",
      "title": "Limit",
      "type": "integer"
     },
     "next_cursor": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "Null on the last page.",
      "title": "Next Cursor"
     },
     "order": {
      "enum": [
       "asc",
       "desc"
      ],
      "title": "Order",
      "type": "string"
     },
     "prev_cursor": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "Null on the first page.",
      "title": "Prev Cursor"
     },
     "sort": {
      "description": "The sort field this page was built with.",
      "title": "Sort",
      "type": "string"
     },
     "total": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "description": "Null unless `include=total` was asked for.",
      "title": "Total"
     },
     "total_is_estimate": {
      "description": "True when the capped count hit `limits.total_count_max` and stopped there.",
      "title": "Total Is Estimate",
      "type": "boolean"
     },
     "unresolved_ids": {
      "description": "The `?ids=` members that do not resolve on the acting account; `[]` otherwise.",
      "items": {
       "type": "string"
      },
      "title": "Unresolved Ids",
      "type": "array"
     }
    },
    "required": [
     "limit",
     "sort",
     "order",
     "has_more",
     "next_cursor",
     "prev_cursor",
     "total",
     "total_is_estimate"
    ],
    "title": "Page",
    "type": "object"
   },
   "PairingCode": {
    "additionalProperties": false,
    "properties": {
     "barcode": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Barcode"
     },
     "code": {
      "title": "Code",
      "type": "string"
     },
     "expires_at": {
      "title": "Expires At",
      "type": "string"
     },
     "station_id": {
      "title": "Station Id",
      "type": "string"
     }
    },
    "required": [
     "station_id",
     "code",
     "barcode",
     "expires_at"
    ],
    "title": "PairingCode",
    "type": "object"
   },
   "PasswordBody": {
    "additionalProperties": false,
    "properties": {
     "current_password": {
      "maxLength": 1024,
      "title": "Current Password",
      "type": "string"
     }
    },
    "required": [
     "current_password"
    ],
    "title": "PasswordBody",
    "type": "object"
   },
   "Printer": {
    "additionalProperties": false,
    "description": "``SPEC.md`` §12.6. ``status`` is ``online`` | ``offline`` | ``retired``, over the existing\n``state`` column plus ``deleted_at`` — no new column, and no agent-side change.",
    "properties": {
     "capabilities_hash": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "Identifies the blob at `/v1/printers/{id}/capabilities`; the blob is never here.",
      "title": "Capabilities Hash"
     },
     "computer": {
      "$ref": "#/components/schemas/printhook_server__v1__routers__printers__ComputerRef"
     },
     "created_at": {
      "title": "Created At",
      "type": "string"
     },
     "description": {
      "title": "Description",
      "type": "string"
     },
     "id": {
      "title": "Id",
      "type": "string"
     },
     "is_default": {
      "title": "Is Default",
      "type": "boolean"
     },
     "name": {
      "title": "Name",
      "type": "string"
     },
     "retired_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Retired At"
     },
     "status": {
      "title": "Status",
      "type": "string"
     },
     "updated_at": {
      "title": "Updated At",
      "type": "string"
     }
    },
    "required": [
     "id",
     "name",
     "description",
     "status",
     "is_default",
     "computer",
     "capabilities_hash",
     "retired_at",
     "created_at",
     "updated_at"
    ],
    "title": "Printer",
    "type": "object"
   },
   "PrinterCapabilities": {
    "additionalProperties": false,
    "description": "The composite of §6.1: the agent's blob verbatim, beside the hash that identifies it.",
    "properties": {
     "capabilities": {
      "anyOf": [
       {
        "additionalProperties": true,
        "type": "object"
       },
       {
        "type": "null"
       }
      ],
      "title": "Capabilities"
     },
     "capabilities_hash": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Capabilities Hash"
     },
     "printer_id": {
      "title": "Printer Id",
      "type": "string"
     }
    },
    "required": [
     "printer_id",
     "capabilities_hash",
     "capabilities"
    ],
    "title": "PrinterCapabilities",
    "type": "object"
   },
   "PrinterTotals": {
    "additionalProperties": false,
    "properties": {
     "online": {
      "title": "Online",
      "type": "integer"
     },
     "total": {
      "title": "Total",
      "type": "integer"
     }
    },
    "required": [
     "total",
     "online"
    ],
    "title": "PrinterTotals",
    "type": "object"
   },
   "PublicMetadata": {
    "additionalProperties": true,
    "properties": {
     "trial_offer": {
      "$ref": "#/components/schemas/TrialOffer"
     }
    },
    "required": [
     "trial_offer"
    ],
    "title": "PublicMetadata",
    "type": "object"
   },
   "Reading": {
    "additionalProperties": false,
    "description": "``mass_ug`` and ``resolution_ug`` are two scalars, never a positional array; ``measurements``\nstays a whole-unit map so nothing downstream has to re-implement unit math; the protocol's own\nreading ``status`` is restored, and the permanently-null ``count`` and ``ntpOffset`` are gone.",
    "properties": {
     "age_ms": {
      "title": "Age Ms",
      "type": "integer"
     },
     "mass_ug": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Mass Ug"
     },
     "measurements": {
      "additionalProperties": {
       "type": "number"
      },
      "title": "Measurements",
      "type": "object"
     },
     "received_at": {
      "title": "Received At",
      "type": "string"
     },
     "reported_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "The agent's own clock, as it sent it.",
      "title": "Reported At"
     },
     "resolution_ug": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Resolution Ug"
     },
     "stale": {
      "description": "True once the reading is past its validity window.",
      "title": "Stale",
      "type": "boolean"
     },
     "status": {
      "description": "`stable`, `unstable`, `zero`, `overload` or `negative`.",
      "title": "Status",
      "type": "string"
     },
     "valid_for_ms": {
      "description": "Negative once stale; the window is published, not folklore.",
      "title": "Valid For Ms",
      "type": "integer"
     },
     "valid_until_at": {
      "title": "Valid Until At",
      "type": "string"
     }
    },
    "required": [
     "mass_ug",
     "resolution_ug",
     "measurements",
     "status",
     "reported_at",
     "received_at",
     "age_ms",
     "stale",
     "valid_for_ms",
     "valid_until_at"
    ],
    "title": "Reading",
    "type": "object"
   },
   "RecoveryCodes": {
    "properties": {
     "recovery_codes": {
      "items": {
       "type": "string"
      },
      "title": "Recovery Codes",
      "type": "array"
     }
    },
    "required": [
     "recovery_codes"
    ],
    "title": "RecoveryCodes",
    "type": "object"
   },
   "RegisterBody": {
    "additionalProperties": false,
    "properties": {
     "email": {
      "title": "Email",
      "type": "string"
     },
     "full_name": {
      "default": "",
      "maxLength": 200,
      "title": "Full Name",
      "type": "string"
     },
     "password": {
      "maxLength": 1024,
      "title": "Password",
      "type": "string"
     }
    },
    "required": [
     "email",
     "password"
    ],
    "title": "RegisterBody",
    "type": "object"
   },
   "ReleasePatch": {
    "additionalProperties": false,
    "description": "The whole of ``PATCH /v1/agent-releases/{id}``: one member, and no other is accepted.\n\n``strict`` is what makes ``{\"enabled\": \"false\"}`` a ``400`` instead of a disable: the lenient\nscalar coercion the form-encoded body needed is deleted with it (§4, §6.2), and a string that\n*looks* like a boolean is the case where coercion is most expensive to be wrong about.",
    "properties": {
     "enabled": {
      "title": "Enabled",
      "type": "boolean"
     }
    },
    "required": [
     "enabled"
    ],
    "title": "ReleasePatch",
    "type": "object"
   },
   "ResetPasswordBody": {
    "additionalProperties": false,
    "properties": {
     "password": {
      "maxLength": 1024,
      "title": "Password",
      "type": "string"
     },
     "token": {
      "maxLength": 256,
      "minLength": 1,
      "title": "Token",
      "type": "string"
     }
    },
    "required": [
     "token",
     "password"
    ],
    "title": "ResetPasswordBody",
    "type": "object"
   },
   "Scan": {
    "additionalProperties": false,
    "properties": {
     "correlation_id": {
      "title": "Correlation Id",
      "type": "string"
     },
     "expires_at": {
      "title": "Expires At",
      "type": "string"
     },
     "station_id": {
      "title": "Station Id",
      "type": "string"
     },
     "value": {
      "title": "Value",
      "type": "string"
     }
    },
    "required": [
     "station_id",
     "correlation_id",
     "value",
     "expires_at"
    ],
    "title": "Scan",
    "type": "object"
   },
   "ScanBody": {
    "additionalProperties": false,
    "properties": {
     "value": {
      "description": "What the bench scanned.",
      "maxLength": 513,
      "title": "Value",
      "type": "string"
     }
    },
    "required": [
     "value"
    ],
    "title": "ScanBody",
    "type": "object"
   },
   "SimulatedReading": {
    "additionalProperties": true,
    "description": "Every member is optional and defaults to a shipped constant (§12.8).\n\n``strict`` keeps the no-coercion rule of §4: a mass sent as a string is a refusal, not a guess.",
    "properties": {
     "device_name": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Device Name"
     },
     "mass_ug": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Mass Ug"
     },
     "resolution_ug": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Resolution Ug"
     },
     "status": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Status"
     },
     "valid_for_sec": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Valid For Sec"
     }
    },
    "title": "SimulatedReading",
    "type": "object"
   },
   "StationBinding": {
    "additionalProperties": false,
    "properties": {
     "device_id": {
      "title": "Device Id",
      "type": "string"
     },
     "device_kind": {
      "title": "Device Kind",
      "type": "string"
     },
     "role": {
      "title": "Role",
      "type": "string"
     },
     "status": {
      "title": "Status",
      "type": "string"
     },
     "updated_at": {
      "title": "Updated At",
      "type": "string"
     }
    },
    "required": [
     "role",
     "device_kind",
     "device_id",
     "status",
     "updated_at"
    ],
    "title": "StationBinding",
    "type": "object"
   },
   "StationObject": {
    "additionalProperties": false,
    "properties": {
     "barcode": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Barcode"
     },
     "bindings": {
      "items": {
       "$ref": "#/components/schemas/StationBinding"
      },
      "title": "Bindings",
      "type": "array"
     },
     "computer": {
      "anyOf": [
       {
        "additionalProperties": true,
        "type": "object"
       },
       {
        "type": "null"
       }
      ],
      "title": "Computer"
     },
     "correlation_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "description": "The open correlation window's id, or null.",
      "title": "Correlation Id"
     },
     "created_at": {
      "title": "Created At",
      "type": "string"
     },
     "deleted_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Deleted At"
     },
     "id": {
      "title": "Id",
      "type": "string"
     },
     "name": {
      "title": "Name",
      "type": "string"
     },
     "paired_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Paired At"
     },
     "pairing_expires_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Pairing Expires At"
     },
     "pending_jobs": {
      "title": "Pending Jobs",
      "type": "integer"
     },
     "status": {
      "description": "`unpaired`, `paired` or `deleted`.",
      "title": "Status",
      "type": "string"
     },
     "tags": {
      "items": {
       "type": "string"
      },
      "title": "Tags",
      "type": "array"
     },
     "updated_at": {
      "title": "Updated At",
      "type": "string"
     }
    },
    "required": [
     "id",
     "name",
     "tags",
     "computer",
     "status",
     "bindings",
     "barcode",
     "paired_at",
     "pairing_expires_at",
     "pending_jobs",
     "correlation_id",
     "created_at",
     "updated_at",
     "deleted_at"
    ],
    "title": "StationObject",
    "type": "object"
   },
   "TokenBody": {
    "additionalProperties": false,
    "properties": {
     "token": {
      "maxLength": 256,
      "minLength": 1,
      "title": "Token",
      "type": "string"
     }
    },
    "required": [
     "token"
    ],
    "title": "TokenBody",
    "type": "object"
   },
   "TrialMetadata": {
    "properties": {
     "ends_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "format": "date-time",
      "title": "Ends At"
     },
     "monthly_print_limit": {
      "maximum": 1000000.0,
      "minimum": 1.0,
      "title": "Monthly Print Limit",
      "type": "integer"
     },
     "started_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "format": "date-time",
      "title": "Started At"
     },
     "status": {
      "enum": [
       "pending",
       "active",
       "expired"
      ],
      "title": "Status",
      "type": "string"
     }
    },
    "required": [
     "status",
     "started_at",
     "ends_at",
     "monthly_print_limit"
    ],
    "title": "TrialMetadata",
    "type": "object"
   },
   "TrialOffer": {
    "properties": {
     "days": {
      "maximum": 365.0,
      "minimum": 1.0,
      "title": "Days",
      "type": "integer"
     },
     "enabled": {
      "title": "Enabled",
      "type": "boolean"
     },
     "expiry_behavior": {
      "const": "stop_printing",
      "title": "Expiry Behavior",
      "type": "string"
     },
     "monthly_print_limit": {
      "maximum": 1000000.0,
      "minimum": 1.0,
      "title": "Monthly Print Limit",
      "type": "integer"
     },
     "no_card_required": {
      "const": true,
      "title": "No Card Required",
      "type": "boolean"
     },
     "starts_on": {
      "const": "email_verification",
      "title": "Starts On",
      "type": "string"
     }
    },
    "required": [
     "enabled",
     "days",
     "monthly_print_limit",
     "no_card_required",
     "starts_on",
     "expiry_behavior"
    ],
    "title": "TrialOffer",
    "type": "object"
   },
   "UpdateStationBody": {
    "additionalProperties": false,
    "description": "``computer_id: null`` detaches the computer (and drops the bindings); an absent member leaves\nit alone. ``model_fields_set`` tells the two apart.",
    "properties": {
     "computer_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Computer Id"
     },
     "name": {
      "anyOf": [
       {
        "maxLength": 120,
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Name"
     },
     "tags": {
      "anyOf": [
       {
        "items": {
         "type": "string"
        },
        "type": "array"
       },
       {
        "type": "null"
       }
      ],
      "title": "Tags"
     }
    },
    "title": "UpdateStationBody",
    "type": "object"
   },
   "Usage": {
    "additionalProperties": false,
    "description": "``SPEC.md`` §11.6.",
    "properties": {
     "agent_versions": {
      "additionalProperties": {
       "type": "integer"
      },
      "description": "Connected computers by reported agent version; `{}` when none is connected.",
      "title": "Agent Versions",
      "type": "object"
     },
     "computers": {
      "$ref": "#/components/schemas/ComputerTotals"
     },
     "lifetime": {
      "$ref": "#/components/schemas/Counters",
      "description": "Every period summed, for the acting account."
     },
     "metrics": {
      "$ref": "#/components/schemas/Counters",
      "description": "This period's counters."
     },
     "period": {
      "description": "The calendar month, UTC, as `YYYY-MM`.",
      "title": "Period",
      "type": "string"
     },
     "printers": {
      "$ref": "#/components/schemas/PrinterTotals"
     }
    },
    "required": [
     "period",
     "metrics",
     "lifetime",
     "computers",
     "printers",
     "agent_versions"
    ],
    "title": "Usage",
    "type": "object"
   },
   "ValidationError": {
    "properties": {
     "ctx": {
      "title": "Context",
      "type": "object"
     },
     "input": {
      "title": "Input"
     },
     "loc": {
      "items": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "integer"
        }
       ]
      },
      "title": "Location",
      "type": "array"
     },
     "msg": {
      "title": "Message",
      "type": "string"
     },
     "type": {
      "title": "Error Type",
      "type": "string"
     }
    },
    "required": [
     "loc",
     "msg",
     "type"
    ],
    "title": "ValidationError",
    "type": "object"
   },
   "WebhookCreate": {
    "additionalProperties": false,
    "description": "``POST /v1/webhooks``. ``secret`` is optional, and an explicit ``null`` is meaningful.",
    "properties": {
     "event_types": {
      "items": {
       "type": "string"
      },
      "title": "Event Types",
      "type": "array"
     },
     "secret": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Secret"
     },
     "url": {
      "title": "Url",
      "type": "string"
     }
    },
    "required": [
     "url",
     "event_types"
    ],
    "title": "WebhookCreate",
    "type": "object"
   },
   "WebhookDelivery": {
    "additionalProperties": false,
    "properties": {
     "attempt": {
      "title": "Attempt",
      "type": "integer"
     },
     "completed_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Completed At"
     },
     "created_at": {
      "title": "Created At",
      "type": "string"
     },
     "duration_ms": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Duration Ms"
     },
     "error": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Error"
     },
     "event_ids": {
      "items": {
       "type": "string"
      },
      "title": "Event Ids",
      "type": "array"
     },
     "id": {
      "title": "Id",
      "type": "string"
     },
     "next_attempt_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Next Attempt At"
     },
     "replay_of_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Replay Of Id"
     },
     "retry_of_id": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Retry Of Id"
     },
     "started_at": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Started At"
     },
     "status": {
      "enum": [
       "queued",
       "delivering",
       "succeeded",
       "failed"
      ],
      "title": "Status",
      "type": "string"
     },
     "status_code": {
      "anyOf": [
       {
        "type": "integer"
       },
       {
        "type": "null"
       }
      ],
      "title": "Status Code"
     },
     "target_host": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Target Host"
     },
     "webhook_id": {
      "title": "Webhook Id",
      "type": "string"
     }
    },
    "required": [
     "id",
     "webhook_id",
     "event_ids",
     "status",
     "attempt",
     "status_code",
     "error",
     "target_host",
     "duration_ms",
     "created_at",
     "started_at",
     "completed_at",
     "next_attempt_at",
     "replay_of_id",
     "retry_of_id"
    ],
    "title": "WebhookDelivery",
    "type": "object"
   },
   "WebhookPatch": {
    "additionalProperties": false,
    "description": "``PATCH /v1/webhooks/{id}``: a merge patch. A member that is absent is left alone; ``secret:\nnull`` clears the secret and leaves the target unsigned.",
    "properties": {
     "event_types": {
      "anyOf": [
       {
        "items": {
         "type": "string"
        },
        "type": "array"
       },
       {
        "type": "null"
       }
      ],
      "title": "Event Types"
     },
     "secret": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Secret"
     },
     "url": {
      "anyOf": [
       {
        "type": "string"
       },
       {
        "type": "null"
       }
      ],
      "title": "Url"
     }
    },
    "title": "WebhookPatch",
    "type": "object"
   },
   "printhook_server__v1__routers__devices__ComputerRef": {
    "additionalProperties": false,
    "description": "The compact reference of §5.5. For the simulated device it is\n``{\"id\": \"cmp_0\", \"name\": \"Simulated\", \"status\": \"simulated\"}`` — the one use of that status\nmember, and the reason ``cmp_0`` has an honest representation instead of a hollowed-out one.",
    "properties": {
     "id": {
      "title": "Id",
      "type": "string"
     },
     "name": {
      "title": "Name",
      "type": "string"
     },
     "status": {
      "title": "Status",
      "type": "string"
     }
    },
    "required": [
     "id",
     "name",
     "status"
    ],
    "title": "ComputerRef",
    "type": "object"
   },
   "printhook_server__v1__routers__printers__ComputerRef": {
    "additionalProperties": false,
    "description": "The compact reference of §5.5: filled, never hollowed out.",
    "properties": {
     "id": {
      "title": "Id",
      "type": "string"
     },
     "name": {
      "title": "Name",
      "type": "string"
     },
     "status": {
      "title": "Status",
      "type": "string"
     }
    },
    "required": [
     "id",
     "name",
     "status"
    ],
    "title": "ComputerRef",
    "type": "object"
   }
  }
 },
 "info": {
  "title": "PrintHook API",
  "version": "v1",
  "contact": {
   "name": "PrintHook support",
   "email": "support@printhook.io",
   "url": "https://printhook.io/developers/"
  },
  "termsOfService": "https://printhook.io/pricing/"
 },
 "openapi": "3.1.0",
 "paths": {
  "/agent/v1/frames": {
   "post": {
    "operationId": "frames_agent_v1_frames_post",
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     }
    },
    "summary": "Frames"
   }
  },
  "/agent/v1/poll": {
   "get": {
    "operationId": "poll_agent_v1_poll_get",
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     }
    },
    "summary": "Poll"
   }
  },
  "/ping": {
   "get": {
    "operationId": "ping_ping_get",
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     }
    },
    "summary": "Ping"
   }
  },
  "/v1/account": {
   "get": {
    "operationId": "get_account_v1_account_get",
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AccountObject"
        }
       }
      },
      "description": "Successful Response"
     }
    },
    "summary": "The acting account",
    "tags": [
     "accounts"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   },
   "patch": {
    "description": "A merge-patch over ``first_name``, ``last_name``, ``email``, ``default_expire_after_sec``,\n``fit_to_page_default`` and ``tags``. Any other member is ``400 unknown_field``.\n\n``state`` is **read-only here**: an account cannot suspend or delete itself. That is a parent\noperation on ``/v1/accounts/{id}``.",
    "operationId": "patch_account_v1_account_patch",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "description": "A merge-patch over the writable members.",
        "title": "Body"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AccountObject"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Change the acting account's settings",
    "tags": [
     "accounts"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   }
  },
  "/v1/accounts": {
   "get": {
    "description": "``?email=`` and ``?creator_ref=`` are what replaced the two lookup headers: a selector is a\nquery, never a credential header. A soft-deleted child is absent from every page.\n\nAdmin, not viewer: a child account is another company's fleet and job history, and the console\nrole that may *reach* one (``PrintHook-Account``) is the role that may enumerate them.",
    "operationId": "list_accounts_v1_accounts_get",
    "parameters": [
     {
      "description": "Resolve one child by its contact address.",
      "in": "query",
      "name": "email",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Resolve one child by its contact address.",
       "title": "Email"
      }
     },
     {
      "description": "Resolve one child by your own reference.",
      "in": "query",
      "name": "creator_ref",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Resolve one child by your own reference.",
       "title": "Creator Ref"
      }
     },
     {
      "description": "`active` or `suspended`.",
      "in": "query",
      "name": "state",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`active` or `suspended`.",
       "title": "State"
      }
     },
     {
      "description": "Case-insensitive substring of the email or name.",
      "in": "query",
      "name": "q",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Case-insensitive substring of the email or name.",
       "title": "Q"
      }
     },
     {
      "description": "1 … `limits.page_limit_max`.",
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "description": "1 … `limits.page_limit_max`.",
       "title": "Limit"
      }
     },
     {
      "description": "A `page.next_cursor` from a previous page.",
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "A `page.next_cursor` from a previous page.",
       "title": "Cursor"
      }
     },
     {
      "description": "`created_at`.",
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`created_at`.",
       "title": "Sort"
      }
     },
     {
      "description": "`asc` or `desc`; `desc` by default.",
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`asc` or `desc`; `desc` by default.",
       "title": "Order"
      }
     },
     {
      "description": "`total` to ask for a capped count.",
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`total` to ask for a capped count.",
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_AccountObject_"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "The child accounts of the acting account",
    "tags": [
     "accounts"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   },
   "post": {
    "description": "No ``password`` and no inline keys.\n\nThe password was required, validated and thrown away — a credential the contract asked for and\nnever stored. The ``ApiKeys`` member that minted up to ten keys inline is replaced by one\nfollow-up call per key: ``POST /v1/keys`` with ``PrintHook-Account: acct_<child>``. That keeps\nminting behind the role gate that guards it and keeps plaintext secrets out of every record the\nserver stores.\n\nTwo gates apply: the owner role, and the account-level ``can_create_sub_accounts`` flag — which is\nnot a console role, so it refuses a key principal too, with its own code.",
    "operationId": "create_account_v1_accounts_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "description": "`{first_name, last_name, email, creator_ref?, tags?}`.",
        "title": "Body"
       }
      }
     },
     "required": true
    },
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AccountObject"
        }
       }
      },
      "description": "The created account, with its `Location`."
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Create a child account",
    "tags": [
     "accounts"
    ],
    "x-printhook-account-header": "deny",
    "x-printhook-principal": "any",
    "x-printhook-role": "owner",
    "x-printhook-scope": "api"
   }
  },
  "/v1/accounts/{id}": {
   "delete": {
    "description": "The account is marked deleted and **every key it holds is revoked**, so nothing can\nauthenticate as it again. It then answers ``404`` on its item route and is absent from every\nlisting.",
    "operationId": "delete_child_account_v1_accounts__id__delete",
    "parameters": [
     {
      "description": "An `acct_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "An `acct_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Soft-delete one child account",
    "tags": [
     "accounts"
    ],
    "x-printhook-account-header": "deny",
    "x-printhook-principal": "any",
    "x-printhook-role": "owner",
    "x-printhook-scope": "api"
   },
   "get": {
    "operationId": "get_child_account_v1_accounts__id__get",
    "parameters": [
     {
      "description": "An `acct_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "An `acct_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AccountObject"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One child account",
    "tags": [
     "accounts"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   },
   "patch": {
    "description": "The members of ``PATCH /v1/account`` plus ``creator_ref`` (with ``409 creator_ref_in_use``),\n``state`` (``active`` | ``suspended``) and ``can_create_child_accounts`` — the last two owner\nonly, by their presence alone.",
    "operationId": "patch_child_account_v1_accounts__id__patch",
    "parameters": [
     {
      "description": "An `acct_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "An `acct_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "description": "A merge-patch; `state` and `can_create_child_accounts` require owner.",
        "title": "Body"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AccountObject"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Change one child account's settings",
    "tags": [
     "accounts"
    ],
    "x-printhook-account-header": "deny",
    "x-printhook-principal": "any",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   }
  },
  "/v1/agent-releases": {
   "get": {
    "description": "The collection of §5.3: filtered on ``os``, ``arch``, ``channel`` and ``enabled``, sorted by\n``released_at``, and addressable by ``?ids=``.",
    "operationId": "list_releases_v1_agent_releases_get",
    "parameters": [
     {
      "description": "`windows`, `osx` or `linux`.",
      "in": "query",
      "name": "os",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`windows`, `osx` or `linux`.",
       "title": "Os"
      }
     },
     {
      "description": "Exact match on the architecture.",
      "in": "query",
      "name": "arch",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Exact match on the architecture.",
       "title": "Arch"
      }
     },
     {
      "description": "Exact match on the channel.",
      "in": "query",
      "name": "channel",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Exact match on the channel.",
       "title": "Channel"
      }
     },
     {
      "description": "`archive` or `installer`.",
      "in": "query",
      "name": "kind",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`archive` or `installer`.",
       "title": "Kind"
      }
     },
     {
      "description": "`true` or `false`.",
      "in": "query",
      "name": "enabled",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`true` or `false`.",
       "title": "Enabled"
      }
     },
     {
      "description": "Comma-separated `rel_` ids.",
      "in": "query",
      "name": "ids",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Comma-separated `rel_` ids.",
       "title": "Ids"
      }
     },
     {
      "description": "1 … `limits.page_limit_max`.",
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "description": "1 … `limits.page_limit_max`.",
       "title": "Limit"
      }
     },
     {
      "description": "A `page.next_cursor` from a previous page.",
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "A `page.next_cursor` from a previous page.",
       "title": "Cursor"
      }
     },
     {
      "description": "`released_at`.",
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`released_at`.",
       "title": "Sort"
      }
     },
     {
      "description": "`asc` or `desc`; `desc` by default.",
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`asc` or `desc`; `desc` by default.",
       "title": "Order"
      }
     },
     {
      "description": "`total` to ask for a capped count.",
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`total` to ask for a capped count.",
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_AgentRelease_"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Every published release, newest first",
    "tags": [
     "agent-releases"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/agent-releases/latest": {
   "get": {
    "description": "The self-updater's manifest, readable with a computer key as well as an integration key.\n\nNothing is published for the platform is a ``404``: the agent maps it to \"no update available\",\nwhich is the truth, and distinguishing it from a refusal is why the ``403`` above has its own\ncode.\n\n``kind`` defaults to ``archive`` because the updater is the caller that must never be handed an\ninstaller; the Console's download button asks for ``installer`` explicitly. The macOS installer\nis stored once as ``arch: universal`` and is offered to either architecture.",
    "operationId": "latest_release_v1_agent_releases_latest_get",
    "parameters": [
     {
      "description": "`windows`, `osx` or `linux`.",
      "in": "query",
      "name": "os",
      "required": true,
      "schema": {
       "description": "`windows`, `osx` or `linux`.",
       "title": "Os",
       "type": "string"
      }
     },
     {
      "description": "`amd64`, `arm64`, …; absent means any.",
      "in": "query",
      "name": "arch",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`amd64`, `arm64`, …; absent means any.",
       "title": "Arch"
      }
     },
     {
      "description": "Stable plus this channel; absent means any.",
      "in": "query",
      "name": "channel",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Stable plus this channel; absent means any.",
       "title": "Channel"
      }
     },
     {
      "description": "`archive` (default; what the self-updater applies) or `installer` (what a person downloads).",
      "in": "query",
      "name": "kind",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`archive` (default; what the self-updater applies) or `installer` (what a person downloads).",
       "title": "Kind"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AgentRelease"
        }
       }
      },
      "description": "The release manifest the agent verifies and installs."
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "The newest release published for one platform",
    "tags": [
     "agent-releases"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "agent_or_api"
   }
  },
  "/v1/agent-releases/{id}": {
   "get": {
    "operationId": "get_release_v1_agent_releases__id__get",
    "parameters": [
     {
      "description": "A `rel_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `rel_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AgentRelease"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One release",
    "tags": [
     "agent-releases"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   },
   "patch": {
    "description": "Single-item on purpose: the route it replaces flipped a whole set in one call, and the two bulk\nactions in this cut are the two with a destructive verb (§5.6). Flipping several is a loop.",
    "operationId": "patch_release_v1_agent_releases__id__patch",
    "parameters": [
     {
      "description": "A `rel_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `rel_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ReleasePatch"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AgentRelease"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Publish or withdraw one release",
    "tags": [
     "agent-releases"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   }
  },
  "/v1/audit": {
   "get": {
    "operationId": "list_audit_v1_audit_get",
    "parameters": [
     {
      "in": "query",
      "name": "q",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "maxLength": 200,
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Q"
      }
     },
     {
      "in": "query",
      "name": "action",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "maxLength": 128,
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Action"
      }
     },
     {
      "in": "query",
      "name": "actor_user_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Actor User Id"
      }
     },
     {
      "in": "query",
      "name": "actor_api_key_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Actor Api Key Id"
      }
     },
     {
      "in": "query",
      "name": "object_type",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "maxLength": 64,
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Object Type"
      }
     },
     {
      "in": "query",
      "name": "created_after",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Created After"
      }
     },
     {
      "in": "query",
      "name": "created_before",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Created Before"
      }
     },
     {
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "title": "Limit"
      }
     },
     {
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Cursor"
      }
     },
     {
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "default": "created_at",
       "title": "Sort",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "default": "desc",
       "title": "Order",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_AuditEntry_"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Search the account's audit history",
    "tags": [
     "audit"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/accept-invitation": {
   "post": {
    "operationId": "accept_invitation_v1_auth_accept_invitation_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/AcceptBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": {
          "type": "string"
         },
         "title": "Response Accept Invitation V1 Auth Accept Invitation Post",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Accept Invitation",
    "tags": [
     "team"
    ],
    "x-printhook-account-header": "deny",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/auth/change-email": {
   "post": {
    "operationId": "change_email_v1_auth_change_email_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ChangeEmailBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "202": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Change Email",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/change-password": {
   "post": {
    "operationId": "change_password_v1_auth_change_password_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ChangePasswordBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Change Password",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/computer-key": {
   "post": {
    "operationId": "computer_key_v1_auth_computer_key_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/AgentKeyBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/AgentKeyResponse"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Computer Key",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/auth/confirm-email-change": {
   "post": {
    "operationId": "confirm_email_change_v1_auth_confirm_email_change_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/TokenBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Confirm Email Change",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/auth/forgot-password": {
   "post": {
    "operationId": "forgot_password_v1_auth_forgot_password_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/EmailBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "202": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Forgot Password",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/auth/invitations": {
   "get": {
    "operationId": "invitations_v1_auth_invitations_get",
    "parameters": [
     {
      "in": "query",
      "name": "status",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Status"
      }
     },
     {
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "title": "Limit"
      }
     },
     {
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Cursor"
      }
     },
     {
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Sort"
      }
     },
     {
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Order"
      }
     },
     {
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Invitations V1 Auth Invitations Get",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Invitations",
    "tags": [
     "team"
    ],
    "x-printhook-account-header": "staff_only",
    "x-printhook-principal": "session",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   },
   "post": {
    "operationId": "invite_v1_auth_invitations_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/InviteBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Invite V1 Auth Invitations Post",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Invite",
    "tags": [
     "team"
    ],
    "x-printhook-account-header": "staff_only",
    "x-printhook-principal": "session",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/invitations/{invitation_id}": {
   "delete": {
    "operationId": "revoke_invitation_v1_auth_invitations__invitation_id__delete",
    "parameters": [
     {
      "in": "path",
      "name": "invitation_id",
      "required": true,
      "schema": {
       "title": "Invitation Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Revoke Invitation",
    "tags": [
     "team"
    ],
    "x-printhook-account-header": "staff_only",
    "x-printhook-principal": "session",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/login": {
   "post": {
    "operationId": "login_v1_auth_login_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/LoginBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Login",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/auth/logout": {
   "post": {
    "operationId": "logout_v1_auth_logout_post",
    "responses": {
     "204": {
      "description": "Successful Response"
     }
    },
    "summary": "Logout",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/logout-all": {
   "post": {
    "operationId": "logout_all_v1_auth_logout_all_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "anyOf": [
         {
          "$ref": "#/components/schemas/LogoutAllBody"
         },
         {
          "type": "null"
         }
        ],
        "title": "Body"
       }
      }
     }
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Logout All",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/mfa": {
   "get": {
    "operationId": "status_v1_auth_mfa_get",
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MFAStatus"
        }
       }
      },
      "description": "Successful Response"
     }
    },
    "summary": "Status",
    "tags": [
     "security"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/mfa/disable": {
   "post": {
    "operationId": "disable_v1_auth_mfa_disable_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ChangeBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Disable",
    "tags": [
     "security"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/mfa/enable": {
   "post": {
    "operationId": "enable_v1_auth_mfa_enable_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CodeBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/RecoveryCodes"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Enable",
    "tags": [
     "security"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/mfa/recovery-codes": {
   "post": {
    "operationId": "recovery_codes_v1_auth_mfa_recovery_codes_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ChangeBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/RecoveryCodes"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Recovery Codes",
    "tags": [
     "security"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/mfa/setup": {
   "post": {
    "operationId": "setup_v1_auth_mfa_setup_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/PasswordBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/MFASetup"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Setup",
    "tags": [
     "security"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/register": {
   "post": {
    "operationId": "register_v1_auth_register_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/RegisterBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "202": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Register",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/auth/resend-verification": {
   "post": {
    "operationId": "resend_verification_v1_auth_resend_verification_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/EmailBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "202": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Resend Verification",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/auth/reset-password": {
   "post": {
    "operationId": "reset_password_v1_auth_reset_password_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ResetPasswordBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Reset Password",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/auth/revert-email-change": {
   "post": {
    "operationId": "revert_email_change_v1_auth_revert_email_change_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/TokenBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Revert Email Change",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/auth/sessions": {
   "get": {
    "operationId": "list_sessions_v1_auth_sessions_get",
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     }
    },
    "summary": "List Sessions",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/sessions/{session_id}": {
   "delete": {
    "operationId": "revoke_session_v1_auth_sessions__session_id__delete",
    "parameters": [
     {
      "in": "path",
      "name": "session_id",
      "required": true,
      "schema": {
       "title": "Session Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Revoke Session",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/team": {
   "get": {
    "operationId": "members_v1_auth_team_get",
    "parameters": [
     {
      "in": "query",
      "name": "q",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Q"
      }
     },
     {
      "in": "query",
      "name": "role",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Role"
      }
     },
     {
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "title": "Limit"
      }
     },
     {
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Cursor"
      }
     },
     {
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Sort"
      }
     },
     {
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Order"
      }
     },
     {
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Members V1 Auth Team Get",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Members",
    "tags": [
     "team"
    ],
    "x-printhook-account-header": "staff_only",
    "x-printhook-principal": "session",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/team/{user_id}": {
   "patch": {
    "operationId": "update_member_v1_auth_team__user_id__patch",
    "parameters": [
     {
      "in": "path",
      "name": "user_id",
      "required": true,
      "schema": {
       "title": "User Id",
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/MemberBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Update Member V1 Auth Team  User Id  Patch",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Update Member",
    "tags": [
     "team"
    ],
    "x-printhook-account-header": "staff_only",
    "x-printhook-principal": "session",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   }
  },
  "/v1/auth/verify-email": {
   "post": {
    "operationId": "verify_email_v1_auth_verify_email_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/TokenBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Verify Email",
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/billing": {
   "get": {
    "operationId": "summary_v1_billing_get",
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BillingSummary"
        }
       }
      },
      "description": "Successful Response"
     }
    },
    "summary": "Summary",
    "tags": [
     "billing"
    ],
    "x-printhook-account-header": "deny",
    "x-printhook-principal": "session",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/billing/checkout": {
   "post": {
    "operationId": "checkout_v1_billing_checkout_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CheckoutBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Checkout",
    "tags": [
     "billing"
    ],
    "x-printhook-account-header": "deny",
    "x-printhook-principal": "session",
    "x-printhook-role": "owner",
    "x-printhook-scope": "api"
   }
  },
  "/v1/billing/portal": {
   "post": {
    "operationId": "portal_v1_billing_portal_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/EmptyBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Portal",
    "tags": [
     "billing"
    ],
    "x-printhook-account-header": "deny",
    "x-printhook-principal": "session",
    "x-printhook-role": "owner",
    "x-printhook-scope": "api"
   }
  },
  "/v1/billing/webhook": {
   "post": {
    "operationId": "webhook_v1_billing_webhook_post",
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     }
    },
    "summary": "Webhook",
    "tags": [
     "billing"
    ],
    "x-printhook-account-header": "deny",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/computer-keys": {
   "post": {
    "description": "Replaces a ``GET`` that minted and revoked a credential.\n\nRe-minting for the same ``install_uuid`` revokes the install's previous key, which is why the body\ncarries no ``label``: the description is the structured ``client:<install_uuid>`` that revocation\nmatches on. The two query parameters the old route read and discarded are gone.",
    "operationId": "create_computer_key_v1_computer_keys_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "description": "`{install_uuid}`.",
        "title": "Body"
       }
      }
     },
     "required": true
    },
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Key"
        }
       }
      },
      "description": "The key, with its secret — the only time it is readable."
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Mint a computer key for one install",
    "tags": [
     "keys"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/computers": {
   "get": {
    "description": "The collection of §5.3, with the two printer counts computed in the same query as each row.",
    "operationId": "list_computers_v1_computers_get",
    "parameters": [
     {
      "description": "`connected` or `disconnected`.",
      "in": "query",
      "name": "status",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`connected` or `disconnected`.",
       "title": "Status"
      }
     },
     {
      "description": "Case-insensitive substring of name or hostname.",
      "in": "query",
      "name": "q",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Case-insensitive substring of name or hostname.",
       "title": "Q"
      }
     },
     {
      "description": "Comma-separated `cmp_` ids.",
      "in": "query",
      "name": "ids",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Comma-separated `cmp_` ids.",
       "title": "Ids"
      }
     },
     {
      "description": "1 … `limits.page_limit_max`.",
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "description": "1 … `limits.page_limit_max`.",
       "title": "Limit"
      }
     },
     {
      "description": "A `page.next_cursor` from a previous page.",
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "A `page.next_cursor` from a previous page.",
       "title": "Cursor"
      }
     },
     {
      "description": "`name`, `created_at` or `last_seen_at`.",
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`name`, `created_at` or `last_seen_at`.",
       "title": "Sort"
      }
     },
     {
      "description": "`asc` or `desc`; `asc` by default.",
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`asc` or `desc`; `asc` by default.",
       "title": "Order"
      }
     },
     {
      "description": "`total` to ask for a capped count.",
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`total` to ask for a capped count.",
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_Computer_"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Every computer enrolled on this account",
    "tags": [
     "computers"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/computers/delete": {
   "post": {
    "description": "The cascade of §12.1, applied to a selection and capped at ``limits.bulk_max_computers``.\n\n``confirm_count`` is compared for **equality**: a computer inventory does not move on its own, so\nany drift means the caller is reading stale state. It is checked against the whole matching\nselection before any write, which is what binds the confirmation to observed state rather than to a\ncopy-pasteable constant — and it is the guard against \"acting-account header plus wildcard delete\".",
    "operationId": "bulk_delete_computers_v1_computers_delete_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/BulkDelete"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BulkResult"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Retire many computers in one call",
    "tags": [
     "computers"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/computers/{id}": {
   "delete": {
    "description": "The full cascade of §12.1. The agent re-enrolls on its own as a brand-new computer with fresh\nprinter ids, which is why the response names the printer ids it just retired: deleting a resource\nshould not renumber a different one, and until ``DELETE /v1/printers/{id}`` existed this was the\nonly way to drop one stale queue.",
    "operationId": "delete_computer_v1_computers__id__delete",
    "parameters": [
     {
      "description": "A `cmp_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `cmp_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ComputerRetireResult"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Retire one computer and everything attached to it",
    "tags": [
     "computers"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   },
   "get": {
    "operationId": "get_computer_v1_computers__id__get",
    "parameters": [
     {
      "description": "A `cmp_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `cmp_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Computer"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One computer",
    "tags": [
     "computers"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/devices": {
   "get": {
    "description": "The collection of §5.3, ordered ``(device_name, device_num, id)`` — today's ``list_readings``\nsort, made total by the id tiebreak so a page boundary is never ambiguous.\n\n``cmp_0`` is an accepted value of ``?computer_id=`` even though it is not a computer row, because\nthis filter addresses the reading store as well as the registry.",
    "operationId": "list_devices_v1_devices_get",
    "parameters": [
     {
      "description": "`scale` is the one family today.",
      "in": "query",
      "name": "kind",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`scale` is the one family today.",
       "title": "Kind"
      }
     },
     {
      "description": "A `cmp_` id; `cmp_0` is accepted.",
      "in": "query",
      "name": "computer_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "A `cmp_` id; `cmp_0` is accepted.",
       "title": "Computer Id"
      }
     },
     {
      "description": "`reporting`, `silent` or `retired`.",
      "in": "query",
      "name": "status",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`reporting`, `silent` or `retired`.",
       "title": "Status"
      }
     },
     {
      "description": "Exact match on the device name.",
      "in": "query",
      "name": "device_name",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Exact match on the device name.",
       "title": "Device Name"
      }
     },
     {
      "description": "Exact match on the device number.",
      "in": "query",
      "name": "device_num",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "description": "Exact match on the device number.",
       "title": "Device Num"
      }
     },
     {
      "description": "Comma-separated `dev_` ids.",
      "in": "query",
      "name": "ids",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Comma-separated `dev_` ids.",
       "title": "Ids"
      }
     },
     {
      "description": "1 … `limits.page_limit_max`.",
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "description": "1 … `limits.page_limit_max`.",
       "title": "Limit"
      }
     },
     {
      "description": "A `page.next_cursor` from a previous page.",
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "A `page.next_cursor` from a previous page.",
       "title": "Cursor"
      }
     },
     {
      "description": "`device_name`.",
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`device_name`.",
       "title": "Sort"
      }
     },
     {
      "description": "`asc` or `desc`; `asc` by default.",
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`asc` or `desc`; `asc` by default.",
       "title": "Order"
      }
     },
     {
      "description": "`total` to ask for a capped count.",
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`total` to ask for a capped count.",
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_Device_"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Every device attached to this account's computers",
    "tags": [
     "devices"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/devices/simulated-readings": {
   "post": {
    "description": "The replacement for ``PUT /scale``. It writes one reading document on computer id ``0`` —\nwhich stops being an undocumented magic integer and becomes a documented one — and creates **no**\nregistry row: it cannot, because ``scales.computer_id`` is a ``NOT NULL`` foreign key to\n``computers.id`` and computer 0 is not a row.\n\nThe same device is then readable through ``GET /v1/devices/{id}``, ``GET /v1/devices/{id}/reading``\nand ``GET /v1/devices?computer_id=cmp_0``. ``GET /v1/computers/cmp_0`` stays a ``404``.",
    "operationId": "create_simulated_reading_v1_devices_simulated_readings_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/SimulatedReading"
       }
      }
     },
     "required": true
    },
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Device"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Publish a simulated reading on the documented address cmp_0",
    "tags": [
     "devices"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/devices/{id}": {
   "get": {
    "operationId": "get_device_v1_devices__id__get",
    "parameters": [
     {
      "description": "A `dev_` id, registered or digest form.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `dev_` id, registered or digest form.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Device"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One device with its reading",
    "tags": [
     "devices"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/devices/{id}/reading": {
   "get": {
    "description": "Built for a polling loop: the status never changes with the data. ``stale`` and\n``valid_for_ms`` say whether the numbers are still good, and a device that has never reported\nanswers ``reading: null`` rather than an error.",
    "operationId": "get_device_reading_v1_devices__id__reading_get",
    "parameters": [
     {
      "description": "A `dev_` id, registered or digest form.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `dev_` id, registered or digest form.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/DeviceReadingEnvelope"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One device's current reading, always 200",
    "tags": [
     "devices"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/event-types": {
   "get": {
    "description": "The catalog, so a subscription user interface never hardcodes the list.\n\nIt is bounded and small, so every member is returned on one page: ``page.has_more`` is always false\nand ``page.next_cursor`` always null.",
    "operationId": "list_event_types_v1_event_types_get",
    "parameters": [
     {
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "title": "Limit"
      }
     },
     {
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Cursor"
      }
     },
     {
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "default": "type",
       "title": "Sort",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "default": "asc",
       "title": "Order",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response List Event Types V1 Event Types Get",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Every event type this deployment emits",
    "tags": [
     "events"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/events": {
   "get": {
    "description": "Cursor-paged over ``(created_at, id)``, ascending by default, which is log order.\n\nA repeated ``type`` is a union; a trailing ``.*`` matches one namespace. ``created_after`` and\n``created_before`` are half-open and both exclusive.",
    "operationId": "list_events_v1_events_get",
    "parameters": [
     {
      "in": "query",
      "name": "type",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "items": {
          "type": "string"
         },
         "type": "array"
        },
        {
         "type": "null"
        }
       ],
       "title": "Type"
      }
     },
     {
      "in": "query",
      "name": "job_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Job Id"
      }
     },
     {
      "in": "query",
      "name": "computer_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Computer Id"
      }
     },
     {
      "in": "query",
      "name": "station_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Station Id"
      }
     },
     {
      "in": "query",
      "name": "correlation_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Correlation Id"
      }
     },
     {
      "in": "query",
      "name": "created_after",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Created After"
      }
     },
     {
      "in": "query",
      "name": "created_before",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Created Before"
      }
     },
     {
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "title": "Limit"
      }
     },
     {
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Cursor"
      }
     },
     {
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "default": "created_at",
       "title": "Sort",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "default": "asc",
       "title": "Order",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response List Events V1 Events Get",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "The account's event log, in log order",
    "tags": [
     "events"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/events/{event_id}": {
   "get": {
    "description": "The exact bytes a webhook delivers for this event.\n\nThe visibility lag of the collection does not apply here: a receiver handed ``webhook-id: evt_…``\nresolves it immediately, which is the whole point of the id being the deduplication key.",
    "operationId": "get_event_v1_events__event_id__get",
    "parameters": [
     {
      "in": "path",
      "name": "event_id",
      "required": true,
      "schema": {
       "title": "Event Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {}
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One event, byte-identical to the webhook body",
    "tags": [
     "events"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/jobs": {
   "get": {
    "description": "The account's jobs, newest first.\n\n``?include=total&limit=1`` is the documented way to ask \"how many?\" — one indexed ``COUNT`` capped\nat ``limits.total_count_max`` and one row of payload. An ``?ids=`` member that does not resolve on\nthe acting account is absent from ``data`` and named in ``page.unresolved_ids``; it is never\nresolved against another account.",
    "operationId": "list_jobs_v1_jobs_get",
    "parameters": [
     {
      "in": "query",
      "name": "status",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Status"
      }
     },
     {
      "in": "query",
      "name": "printer_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Printer Id"
      }
     },
     {
      "in": "query",
      "name": "computer_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Computer Id"
      }
     },
     {
      "in": "query",
      "name": "station_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Station Id"
      }
     },
     {
      "in": "query",
      "name": "source",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Source"
      }
     },
     {
      "in": "query",
      "name": "created_after",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Created After"
      }
     },
     {
      "in": "query",
      "name": "created_before",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Created Before"
      }
     },
     {
      "in": "query",
      "name": "ids",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Ids"
      }
     },
     {
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "title": "Limit"
      }
     },
     {
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Cursor"
      }
     },
     {
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Sort"
      }
     },
     {
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Order"
      }
     },
     {
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_dict_str__Any__"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "List print jobs",
    "tags": [
     "jobs"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   },
   "post": {
    "description": "Create a job. The only route that honors ``Idempotency-Key``.\n\nThe job never waits for the agent: durability, then return. A dispatch failure after the commit is\nswallowed, and the sweep, the acknowledgement timeout and the reconnect replay deliver it.\n\nA caller whose request timed out and sent no key is not stuck; ``source`` is caller-supplied and\nfilterable, so ``GET /v1/jobs?source=…&created_after=…&limit=5`` reconciles.",
    "operationId": "create_job_v1_jobs_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CreateJobBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Create Job V1 Jobs Post",
         "type": "object"
        }
       }
      },
      "description": "The job object, plus a Location header"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Create a print job",
    "tags": [
     "jobs"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/jobs/cancel": {
   "post": {
    "description": "The bulk grammar of ``SPEC`` §5.6. The sensible selection is ``{\"filter\": {\"status\": \"queued\"}}``.\n\n``confirm_count`` is compared against the whole matching selection **before any write**, and the\ncomparison here is monotone — ``actual_count <= confirm_count`` — because agents drain a queue\ncontinuously and strict equality would make the route unusable on a busy account. The hazard the\nconfirmation guards is a selection that turns out *larger* than the caller believed; a job that left\nthe selection because it printed is not that hazard.",
    "operationId": "bulk_cancel_jobs_v1_jobs_cancel_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/BulkCancelBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/BulkResult"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Cancel many jobs at once",
    "tags": [
     "jobs"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/jobs/timeline": {
   "get": {
    "description": "Every row of every job's history on this account, in one call.\n\nThis is the replacement for the array-of-arrays keyed positionally to a page of jobs. It carries\nthe agent's progress rows — ``downloading``, the informational ``spooled``, ``spool_error`` — which\nthe event log never records, and every row carries its ``job_id``, so the rows are attributable.\n\n``print_job_states`` carries no account, so the route is a join to ``print_jobs`` walked over\n``ix_print_job_states_created`` **inside a time window**: when neither ``created_after`` nor\n``created_before`` is given, ``created_after`` defaults to ``limits.timeline_default_window_sec``\nago. The default is published, so the window is never a surprise.",
    "operationId": "account_timeline_v1_jobs_timeline_get",
    "parameters": [
     {
      "in": "query",
      "name": "job_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Job Id"
      }
     },
     {
      "in": "query",
      "name": "status",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Status"
      }
     },
     {
      "in": "query",
      "name": "created_after",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Created After"
      }
     },
     {
      "in": "query",
      "name": "created_before",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Created Before"
      }
     },
     {
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "title": "Limit"
      }
     },
     {
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Cursor"
      }
     },
     {
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Sort"
      }
     },
     {
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Order"
      }
     },
     {
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_dict_str__Any__"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "The account-wide job history, across every job",
    "tags": [
     "jobs"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/jobs/{job_id}": {
   "get": {
    "operationId": "get_job_v1_jobs__job_id__get",
    "parameters": [
     {
      "in": "path",
      "name": "job_id",
      "required": true,
      "schema": {
       "title": "Job Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Get Job V1 Jobs  Job Id  Get",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One print job",
    "tags": [
     "jobs"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/jobs/{job_id}/cancel": {
   "post": {
    "description": "Cancel a queued job and return the **job object**, so a caller learns the outcome instead of\ninferring it from the length of an array of integers.\n\nOnly a job still ``queued`` can be canceled: the conditional ``UPDATE … WHERE state='new' …\nRETURNING`` leaves a job the agent acknowledged in the race alone, and that job answers\n``409 not_cancelable`` with its current ``meta.status``.",
    "operationId": "cancel_job_v1_jobs__job_id__cancel_post",
    "parameters": [
     {
      "in": "path",
      "name": "job_id",
      "required": true,
      "schema": {
       "title": "Job Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Cancel Job V1 Jobs  Job Id  Cancel Post",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Cancel one print job",
    "tags": [
     "jobs"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/jobs/{job_id}/timeline": {
   "get": {
    "description": "Every row this job has recorded, oldest first — the history's own order.\n\nThe timeline is explicitly tolerant of out-of-order and post-terminal rows: a consumer stops polling\nwhen **any** row is ``terminal``, never when the last one is, because the agent's progress reports\ncan land after a terminal row (an acknowledgement that arrives late is kept once, as a ``delivered``\nrow with ``detail.late``, appended after the terminal row and announcing nothing).",
    "operationId": "job_timeline_v1_jobs__job_id__timeline_get",
    "parameters": [
     {
      "in": "path",
      "name": "job_id",
      "required": true,
      "schema": {
       "title": "Job Id",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "title": "Limit"
      }
     },
     {
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Cursor"
      }
     },
     {
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Sort"
      }
     },
     {
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Order"
      }
     },
     {
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_dict_str__Any__"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One job's append-only history",
    "tags": [
     "jobs"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/keys": {
   "get": {
    "description": "Metadata only: ``secret`` is null on every row, always.\n\n``status`` defaults to ``live``. It is named ``status`` rather than ``revoked`` because it has\nthree members, and a three-member enum wearing a boolean's name is exactly the coercion this\nsurface removed.",
    "operationId": "list_keys_v1_keys_get",
    "parameters": [
     {
      "description": "`integration` or `computer`.",
      "in": "query",
      "name": "kind",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`integration` or `computer`.",
       "title": "Kind"
      }
     },
     {
      "description": "`live` (default), `revoked` or `any`.",
      "in": "query",
      "name": "status",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`live` (default), `revoked` or `any`.",
       "title": "Status"
      }
     },
     {
      "description": "1 … `limits.page_limit_max`.",
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "description": "1 … `limits.page_limit_max`.",
       "title": "Limit"
      }
     },
     {
      "description": "A `page.next_cursor` from a previous page.",
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "A `page.next_cursor` from a previous page.",
       "title": "Cursor"
      }
     },
     {
      "description": "`created_at`.",
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`created_at`.",
       "title": "Sort"
      }
     },
     {
      "description": "`asc` or `desc`; `desc` by default.",
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`asc` or `desc`; `desc` by default.",
       "title": "Order"
      }
     },
     {
      "description": "`total` to ask for a capped count.",
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`total` to ask for a capped count.",
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_Key_"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "The acting account's credentials, as metadata",
    "tags": [
     "keys"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   },
   "post": {
    "description": "``{label}``: 1 … ``limits.key_label_max_chars`` characters, unique among the account's live\nkeys (``409 key_label_in_use``).\n\nTo mint a key **for a child account**, send ``PrintHook-Account: acct_<child>``. That is the\nreplacement for the inline key list of the old create-account body, and it keeps minting behind\nthis route's own role gate.\n\nThe secret is in this response and in no other. The audit row is written before it is rendered.",
    "operationId": "create_key_v1_keys_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "description": "`{label}`.",
        "title": "Body"
       }
      }
     },
     "required": true
    },
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Key"
        }
       }
      },
      "description": "The key, with its secret — the only time it is readable."
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Mint an integration key",
    "tags": [
     "keys"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   }
  },
  "/v1/keys/{id}": {
   "delete": {
    "description": "Revoking a computer key signs that computer out, unchanged. The audit row is written while the\nkey still resolves to an id.",
    "operationId": "revoke_key_v1_keys__id__delete",
    "parameters": [
     {
      "description": "A `key_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `key_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Revoke one key",
    "tags": [
     "keys"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "admin",
    "x-printhook-scope": "api"
   },
   "get": {
    "description": "A revoked key still reads, with ``revoked_at`` set: an operator needs to see that a credential\nwas withdrawn, not to have it disappear. ``secret`` is null.",
    "operationId": "get_key_v1_keys__id__get",
    "parameters": [
     {
      "description": "A `key_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `key_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Key"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One key, metadata only",
    "tags": [
     "keys"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/me": {
   "get": {
    "operationId": "get_me_v1_me_get",
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Get Me V1 Me Get",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     }
    },
    "summary": "The signed-in principal, its role and the limits that apply to it",
    "tags": [
     "identity"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/meta": {
   "get": {
    "operationId": "get_meta_v1_meta_get",
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PublicMetadata"
        }
       }
      },
      "description": "Successful Response"
     }
    },
    "summary": "Every limit, enum, error code and format this deployment publishes",
    "tags": [
     "meta"
    ],
    "x-printhook-account-header": "deny",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "public"
   }
  },
  "/v1/printers": {
   "get": {
    "description": "The collection of §5.3. Retired printers are excluded unless ``include_retired=true``, and an\nexplicit ``status=retired`` selects them either way — a filter value that can only return nothing\nwould be worse than the exclusion it respects.",
    "operationId": "list_printers_v1_printers_get",
    "parameters": [
     {
      "description": "A `cmp_` id.",
      "in": "query",
      "name": "computer_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "A `cmp_` id.",
       "title": "Computer Id"
      }
     },
     {
      "description": "`online`, `offline` or `retired`.",
      "in": "query",
      "name": "status",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`online`, `offline` or `retired`.",
       "title": "Status"
      }
     },
     {
      "description": "Case-insensitive substring of name or description.",
      "in": "query",
      "name": "q",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Case-insensitive substring of name or description.",
       "title": "Q"
      }
     },
     {
      "description": "`true` or `false`.",
      "in": "query",
      "name": "include_retired",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`true` or `false`.",
       "title": "Include Retired"
      }
     },
     {
      "description": "Comma-separated `prn_` ids.",
      "in": "query",
      "name": "ids",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Comma-separated `prn_` ids.",
       "title": "Ids"
      }
     },
     {
      "description": "1 … `limits.page_limit_max`.",
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "description": "1 … `limits.page_limit_max`.",
       "title": "Limit"
      }
     },
     {
      "description": "A `page.next_cursor` from a previous page.",
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "A `page.next_cursor` from a previous page.",
       "title": "Cursor"
      }
     },
     {
      "description": "`name` or `created_at`.",
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`name` or `created_at`.",
       "title": "Sort"
      }
     },
     {
      "description": "`asc` or `desc`; `asc` by default.",
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`asc` or `desc`; `asc` by default.",
       "title": "Order"
      }
     },
     {
      "description": "`total` to ask for a capped count.",
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`total` to ask for a capped count.",
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_Printer_"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Every printer the agents on this account report",
    "tags": [
     "printers"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/printers/{id}": {
   "delete": {
    "description": "Sets ``deleted_at`` and ``state``, the same two writes ``DELETE /v1/computers`` already performs\non a computer's printers — so no new column, and the printer **keeps its id**.\n\nRetiring an already-retired printer is ``204`` and writes nothing: the outcome the caller asked for\nalready holds, and a second refusal would make a retry an error.",
    "operationId": "delete_printer_v1_printers__id__delete",
    "parameters": [
     {
      "description": "A `prn_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `prn_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Retire a queue the agent no longer reports",
    "tags": [
     "printers"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   },
   "get": {
    "description": "A retired printer still resolves here and renders with ``status: \"retired\"``. Keeping the id\nvalid is the whole reason retiring one beats renumbering a machine.",
    "operationId": "get_printer_v1_printers__id__get",
    "parameters": [
     {
      "description": "A `prn_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `prn_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Printer"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One printer, without its capability blob",
    "tags": [
     "printers"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/printers/{id}/capabilities": {
   "get": {
    "description": "The blob the agent computed, passed through untranslated (§4.2). The server neither validates it\nnor reshapes it: the agent is the authority on what its printers can do.",
    "operationId": "get_printer_capabilities_v1_printers__id__capabilities_get",
    "parameters": [
     {
      "description": "A `prn_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `prn_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PrinterCapabilities"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One printer's capability blob, verbatim",
    "tags": [
     "printers"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/stations": {
   "get": {
    "operationId": "list_stations_v1_stations_get",
    "parameters": [
     {
      "description": "A `cmp_` id.",
      "in": "query",
      "name": "computer_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "A `cmp_` id.",
       "title": "Computer Id"
      }
     },
     {
      "description": "Stations carrying this tag.",
      "in": "query",
      "name": "tag",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Stations carrying this tag.",
       "title": "Tag"
      }
     },
     {
      "description": "Case-insensitive substring of the name.",
      "in": "query",
      "name": "q",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Case-insensitive substring of the name.",
       "title": "Q"
      }
     },
     {
      "description": "`true` or `false`.",
      "in": "query",
      "name": "include_deleted",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`true` or `false`.",
       "title": "Include Deleted"
      }
     },
     {
      "description": "Comma-separated `stn_` ids.",
      "in": "query",
      "name": "ids",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "Comma-separated `stn_` ids.",
       "title": "Ids"
      }
     },
     {
      "description": "1 … `limits.page_limit_max`.",
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "description": "1 … `limits.page_limit_max`.",
       "title": "Limit"
      }
     },
     {
      "description": "A `page.next_cursor` from a previous page.",
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "A `page.next_cursor` from a previous page.",
       "title": "Cursor"
      }
     },
     {
      "description": "`name` or `created_at`.",
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`name` or `created_at`.",
       "title": "Sort"
      }
     },
     {
      "description": "`asc` or `desc`; `asc` by default.",
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`asc` or `desc`; `asc` by default.",
       "title": "Order"
      }
     },
     {
      "description": "`total` to ask for a capped count.",
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`total` to ask for a capped count.",
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_StationObject_"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Every station on this account",
    "tags": [
     "stations"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   },
   "post": {
    "operationId": "create_station_v1_stations_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/CreateStationBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/StationObject"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Create a station",
    "tags": [
     "stations"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/stations/{id}": {
   "delete": {
    "description": "Soft: the id keeps resolving with ``status: \"deleted\"`` so a job that named it still reads.\n``409 station_busy`` while jobs addressed to it are pending.",
    "operationId": "delete_station_v1_stations__id__delete",
    "parameters": [
     {
      "description": "A `stn_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `stn_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Delete a station",
    "tags": [
     "stations"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   },
   "get": {
    "operationId": "get_station_v1_stations__id__get",
    "parameters": [
     {
      "description": "A `stn_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `stn_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/StationObject"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One station with its bindings",
    "tags": [
     "stations"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   },
   "patch": {
    "operationId": "update_station_v1_stations__id__patch",
    "parameters": [
     {
      "description": "A `stn_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `stn_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/UpdateStationBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/StationObject"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Rename, retag or move a station",
    "tags": [
     "stations"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/stations/{id}/devices/{role}": {
   "delete": {
    "operationId": "unbind_device_v1_stations__id__devices__role__delete",
    "parameters": [
     {
      "description": "A `stn_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `stn_` id.",
       "title": "Id",
       "type": "string"
      }
     },
     {
      "description": "One of the station roles.",
      "in": "path",
      "name": "role",
      "required": true,
      "schema": {
       "description": "One of the station roles.",
       "title": "Role",
       "type": "string"
      }
     }
    ],
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Unbind a role",
    "tags": [
     "stations"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   },
   "put": {
    "operationId": "bind_device_v1_stations__id__devices__role__put",
    "parameters": [
     {
      "description": "A `stn_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `stn_` id.",
       "title": "Id",
       "type": "string"
      }
     },
     {
      "description": "One of the station roles.",
      "in": "path",
      "name": "role",
      "required": true,
      "schema": {
       "description": "One of the station roles.",
       "title": "Role",
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/BindBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/StationObject"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Bind a device to a role",
    "tags": [
     "stations"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/stations/{id}/pairing-code": {
   "post": {
    "description": "Six characters, fifteen minutes, single use, shown once. A person at the bench types it into\n``printhook-agent enroll --station``; the barcode on the station does the same job permanently.",
    "operationId": "mint_pairing_code_v1_stations__id__pairing_code_post",
    "parameters": [
     {
      "description": "A `stn_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `stn_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/PairingCode"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Mint a pairing code for a bench",
    "tags": [
     "stations"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/stations/{id}/scan": {
   "post": {
    "description": "Opens a ten-minute correlation window: every job (and later weight and photo) at the station\ninside it carries the window's ``correlation_id``, and ``GET /v1/events?correlation_id=`` lists\nthe transaction. Posted by an integration today, by the scanner transport tomorrow.",
    "operationId": "record_scan_v1_stations__id__scan_post",
    "parameters": [
     {
      "description": "A `stn_` id.",
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "description": "A `stn_` id.",
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/ScanBody"
       }
      }
     },
     "required": true
    },
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Scan"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Record a scan at the bench",
    "tags": [
     "stations"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/usage": {
   "get": {
    "operationId": "get_usage_v1_usage_get",
    "parameters": [
     {
      "description": "`YYYY-MM`; the current UTC month by default.",
      "in": "query",
      "name": "period",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "description": "`YYYY-MM`; the current UTC month by default.",
       "title": "Period"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Usage"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Metered counters for one month, and the fleet totals",
    "tags": [
     "usage"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/webhook-deliveries": {
   "get": {
    "operationId": "list_deliveries_v1_webhook_deliveries_get",
    "parameters": [
     {
      "in": "query",
      "name": "webhook_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Webhook Id"
      }
     },
     {
      "in": "query",
      "name": "event_id",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Event Id"
      }
     },
     {
      "in": "query",
      "name": "status",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Status"
      }
     },
     {
      "in": "query",
      "name": "created_after",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Created After"
      }
     },
     {
      "in": "query",
      "name": "created_before",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Created Before"
      }
     },
     {
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "title": "Limit"
      }
     },
     {
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Cursor"
      }
     },
     {
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "default": "created_at",
       "title": "Sort",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "default": "desc",
       "title": "Order",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Collection_WebhookDelivery_"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Webhook delivery history",
    "tags": [
     "webhook deliveries"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/webhook-deliveries/{id}": {
   "get": {
    "operationId": "get_delivery_v1_webhook_deliveries__id__get",
    "parameters": [
     {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/WebhookDelivery"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One webhook delivery attempt",
    "tags": [
     "webhook deliveries"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   }
  },
  "/v1/webhook-deliveries/{id}/replay": {
   "post": {
    "operationId": "replay_delivery_v1_webhook_deliveries__id__replay_post",
    "parameters": [
     {
      "in": "path",
      "name": "id",
      "required": true,
      "schema": {
       "title": "Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "202": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/WebhookDelivery"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Queue a replay using the current webhook settings",
    "tags": [
     "webhook deliveries"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/webhooks": {
   "get": {
    "description": "``?event_types=`` matches by membership: a webhook is returned when the named type is in its\n``event_types`` array. The parameter is plural because the field is.",
    "operationId": "list_webhooks_v1_webhooks_get",
    "parameters": [
     {
      "in": "query",
      "name": "event_types",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Event Types"
      }
     },
     {
      "in": "query",
      "name": "limit",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "integer"
        },
        {
         "type": "null"
        }
       ],
       "title": "Limit"
      }
     },
     {
      "in": "query",
      "name": "cursor",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Cursor"
      }
     },
     {
      "in": "query",
      "name": "sort",
      "required": false,
      "schema": {
       "default": "created_at",
       "title": "Sort",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "order",
      "required": false,
      "schema": {
       "default": "desc",
       "title": "Order",
       "type": "string"
      }
     },
     {
      "in": "query",
      "name": "include",
      "required": false,
      "schema": {
       "anyOf": [
        {
         "type": "string"
        },
        {
         "type": "null"
        }
       ],
       "title": "Include"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response List Webhooks V1 Webhooks Get",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "The account's subscriptions; never a secret",
    "tags": [
     "webhooks"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   },
   "post": {
    "operationId": "create_webhook_v1_webhooks_post",
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/WebhookCreate"
       }
      }
     },
     "required": true
    },
    "responses": {
     "201": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Create Webhook V1 Webhooks Post",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Subscribe to event types; the secret is returned once",
    "tags": [
     "webhooks"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  },
  "/v1/webhooks/{webhook_id}": {
   "delete": {
    "operationId": "delete_webhook_v1_webhooks__webhook_id__delete",
    "parameters": [
     {
      "in": "path",
      "name": "webhook_id",
      "required": true,
      "schema": {
       "title": "Webhook Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "204": {
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Stop delivering to this target",
    "tags": [
     "webhooks"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   },
   "get": {
    "operationId": "get_webhook_v1_webhooks__webhook_id__get",
    "parameters": [
     {
      "in": "path",
      "name": "webhook_id",
      "required": true,
      "schema": {
       "title": "Webhook Id",
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Get Webhook V1 Webhooks  Webhook Id  Get",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "One subscription with its delivery statistics",
    "tags": [
     "webhooks"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "viewer",
    "x-printhook-scope": "api"
   },
   "patch": {
    "operationId": "patch_webhook_v1_webhooks__webhook_id__patch",
    "parameters": [
     {
      "in": "path",
      "name": "webhook_id",
      "required": true,
      "schema": {
       "title": "Webhook Id",
       "type": "string"
      }
     }
    ],
    "requestBody": {
     "content": {
      "application/json": {
       "schema": {
        "$ref": "#/components/schemas/WebhookPatch"
       }
      }
     },
     "required": true
    },
    "responses": {
     "200": {
      "content": {
       "application/json": {
        "schema": {
         "additionalProperties": true,
         "title": "Response Patch Webhook V1 Webhooks  Webhook Id  Patch",
         "type": "object"
        }
       }
      },
      "description": "Successful Response"
     },
     "422": {
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/HTTPValidationError"
        }
       }
      },
      "description": "Validation Error"
     }
    },
    "summary": "Change the URL, the subscription or the secret",
    "tags": [
     "webhooks"
    ],
    "x-printhook-account-header": "allow",
    "x-printhook-principal": "any",
    "x-printhook-role": "operator",
    "x-printhook-scope": "api"
   }
  }
 },
 "servers": [
  {
   "url": "https://api.printhook.io",
   "description": "PrintHook"
  }
 ]
}
