{
  "openapi": "3.1.1",
  "info": {
    "title": "Timekeeper REST API",
    "version": "1.0.0",
    "description": "Owner-scoped Timekeeper API for Eclipse and web clients. API major version 1 is independent of Timekeeper product version 2.0. See api/README.md for normative ownership, concurrency, retry and compatibility policies.",
    "license": {
      "name": "Eclipse Public License 1.0",
      "url": "https://www.eclipse.org/legal/epl-v10.html"
    }
  },
  "servers": [
    {
      "url": "/api/v1"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    },
    {
      "browserSession": []
    }
  ],
  "paths": {
    "/projects": {
      "get": {
        "operationId": "listProjects",
        "summary": "List owned projects",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProjectPage"
                }
              }
            },
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/Query"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "name": "clientId",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/Id"
            },
            "description": "Only records belonging to this client."
          }
        ]
      },
      "post": {
        "operationId": "createProject",
        "summary": "Create owned project",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "Location": {
                "schema": {
                  "type": "string"
                },
                "description": "Relative or same-origin /api/v1 resource URL."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectInput"
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/projects/{id}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ],
      "get": {
        "operationId": "getProject",
        "summary": "Read owned project",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "put": {
        "operationId": "updateProject",
        "summary": "Replace editable project fields",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Project"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProjectInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteProject",
        "summary": "Delete unused owned project",
        "x-required-permission": "write",
        "responses": {
          "204": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/tasks": {
      "get": {
        "operationId": "listTasks",
        "summary": "List owned tasks",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TaskPage"
                }
              }
            },
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/Query"
          },
          {
            "name": "projectId",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Id"
            }
          },
          {
            "name": "parentTaskId",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Id"
            }
          },
          {
            "name": "unassigned",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "true selects tasks without a project; cannot be combined with projectId."
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "post": {
        "operationId": "createTask",
        "summary": "Create owned task",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Task"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "Location": {
                "schema": {
                  "type": "string"
                },
                "description": "Relative or same-origin /api/v1 resource URL."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaskCreateInput"
              }
            }
          }
        },
        "description": "Create the task and optional externalReferences atomically. Missing externalReferences means an empty list. Any identity already linked within this owner returns 409 without creating an orphan task. On an ambiguous response with a provider identity, reconcile through findTaskByExternalReference.",
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/tasks/{id}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ],
      "get": {
        "operationId": "getTask",
        "summary": "Read owned task",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Task"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "put": {
        "operationId": "updateTask",
        "summary": "Replace editable task fields",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Task"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TaskInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteTask",
        "summary": "Delete unused owned task",
        "x-required-permission": "write",
        "responses": {
          "204": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/labels": {
      "get": {
        "operationId": "listLabels",
        "summary": "List owned labels",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LabelPage"
                }
              }
            },
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/Query"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "post": {
        "operationId": "createLabel",
        "summary": "Create owned label",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Label"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "Location": {
                "schema": {
                  "type": "string"
                },
                "description": "Relative or same-origin /api/v1 resource URL."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LabelInput"
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/labels/{id}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ],
      "get": {
        "operationId": "getLabel",
        "summary": "Read owned label",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Label"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "put": {
        "operationId": "updateLabel",
        "summary": "Replace editable label fields",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Label"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LabelInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteLabel",
        "summary": "Delete unused owned label",
        "x-required-permission": "write",
        "responses": {
          "204": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/tasks/by-external-reference": {
      "get": {
        "operationId": "findTaskByExternalReference",
        "summary": "Find an owned task by provider identity",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Task"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "name": "providerId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            }
          },
          {
            "name": "repositoryId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096,
              "pattern": "\\S"
            }
          },
          {
            "name": "externalId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 1000,
              "pattern": "\\S"
            }
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      }
    },
    "/tasks/{id}/external-references": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ],
      "put": {
        "operationId": "linkExternalReference",
        "summary": "Link or update a provider identity",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Task"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ExternalReference"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "unlinkExternalReference",
        "summary": "Unlink a provider identity without deleting recorded history",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Task"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "name": "providerId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200,
              "pattern": "\\S"
            }
          },
          {
            "name": "repositoryId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096,
              "pattern": "\\S"
            }
          },
          {
            "name": "externalId",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 1000,
              "pattern": "\\S"
            }
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/activities": {
      "get": {
        "operationId": "listActivities",
        "summary": "List owned intervals overlapping [from,to)",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActivityPage"
                }
              }
            },
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Instant"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Instant"
            }
          },
          {
            "name": "taskId",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Id"
            }
          },
          {
            "name": "projectId",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Id"
            }
          },
          {
            "name": "labelId",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Id"
            }
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "post": {
        "operationId": "createActivity",
        "summary": "Record a manual interval",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Activity"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "Location": {
                "schema": {
                  "type": "string"
                },
                "description": "Relative or same-origin /api/v1 resource URL."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActivityInput"
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "description": "Store separate daily activities at elapsed local midnight boundaries in the owner’s configured zone, preserving exact time, task, summary and labels. The response and ETag identify the last part; earlier parts appear as separate activities and change events and are edited/deleted independently."
      }
    },
    "/activities/{id}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ],
      "get": {
        "operationId": "getActivity",
        "summary": "Read an owned interval",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Activity"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "put": {
        "operationId": "updateActivity",
        "summary": "Edit a recorded interval without changing its task or owner",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Activity"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActivityUpdate"
              }
            }
          }
        },
        "description": "Store separate daily activities at elapsed local midnight boundaries in the owner’s configured zone, preserving exact time, task, summary and labels. The response and ETag identify the last part; earlier parts appear as separate activities and change events and are edited/deleted independently."
      },
      "delete": {
        "operationId": "deleteActivity",
        "summary": "Delete an owned interval",
        "x-required-permission": "write",
        "responses": {
          "204": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/activities/active": {
      "get": {
        "operationId": "getActiveActivity",
        "summary": "Read the authenticated owner’s current interval",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Activity"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "204": {
            "description": "No open activity for this owner.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          }
        },
        "description": "200 with an Activity and ETag, or 204 with no body when no activity is open.",
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      }
    },
    "/activities/start": {
      "post": {
        "operationId": "startActivity",
        "summary": "Atomically activate or switch the owner’s task",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Activity"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "Location": {
                "schema": {
                  "type": "string"
                },
                "description": "Relative or same-origin /api/v1 resource URL."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Activity"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "description": "Compare expectedActiveId/version with the current open interval under an owner lock. Null/null requires no open interval. Mismatch: 409 ACTIVE_STATE_CHANGED without changes. Same task: return the existing interval with 200. Different task: stop it and create the successor using one server-clock instant, in one transaction. Replay a successful command before rechecking active state.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartActivityInput"
              }
            }
          }
        }
      }
    },
    "/activities/{id}/stop": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ],
      "post": {
        "operationId": "stopActivity",
        "summary": "Stop at the server clock instant",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Activity"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "description": "Stop an open interval. A newly keyed command for an already stopped interval with its current ETag returns it unchanged. A successful same-key replay returns its original response, even with its original stale ETag. Store separate daily activities at elapsed local midnight boundaries in the owner’s configured zone, preserving exact time, task, summary and labels. The response and ETag identify the last part; earlier parts appear as separate activities and change events and are edited/deleted independently.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/me": {
      "get": {
        "operationId": "getProfile",
        "summary": "Read authenticated identity and reporting time zone",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Profile"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "put": {
        "operationId": "updateProfile",
        "summary": "Set the owner’s reporting time zone",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Profile"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProfileInput"
              }
            }
          }
        }
      }
    },
    "/reports/activities": {
      "get": {
        "operationId": "reportActivities",
        "summary": "Calculate daily/task and total durations over an owner-scoped range",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Report"
                }
              }
            },
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "description": "Use the owner’s configured zone unless overridden. End is exclusive. Clip intervals to the requested range and local days; open intervals end at one generatedAt instant. Sum durations, including overlaps, using exact nanoseconds. Days are local calendar days, Monday begins a week; DST changes do not assume 24-hour days. No pagination truncates the report totals.",
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Instant"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Instant"
            }
          },
          {
            "name": "taskId",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Id"
            }
          },
          {
            "name": "projectId",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Id"
            }
          },
          {
            "name": "labelId",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/Id"
            }
          },
          {
            "name": "zoneId",
            "in": "query",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/ZoneId"
            }
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      }
    },
    "/changes": {
      "get": {
        "operationId": "listChanges",
        "summary": "Long-poll committed owner-scoped changes",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangePage"
                }
              }
            },
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "description": "after is the last processed owner-local sequence. Wait up to waitSeconds if there are no newer events. Retain at least seven days; a cursor older than retained history or ahead of the owner’s head returns 409 RESYNC_REQUIRED. Empty results preserve after. Events are published only after commit; sequence gaps are allowed. Read fresh resources by ID, keeping unsaved local edits until explicitly resolved.",
        "parameters": [
          {
            "name": "after",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/Version"
            }
          },
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "name": "waitSeconds",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 25,
              "default": 0
            }
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      }
    },
    "/data/export": {
      "get": {
        "operationId": "exportData",
        "summary": "Export an owner-scoped portable domain snapshot",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransferSnapshot"
                }
              }
            },
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "description": "Read an owner-neutral timekeeper-domain-v3 snapshot with clients, projects, tasks, labels, activities and independent work sessions in one transaction. Activities have no workSessionId. Maximum 10,000 per type and 20 MiB.",
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      }
    },
    "/data/import": {
      "post": {
        "operationId": "importData",
        "summary": "Atomically import portable domain records into the current owner",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportResult"
                }
              }
            },
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "description": "Validate and import a complete owner-neutral v1, v2 or v3 snapshot atomically with fresh IDs. Preserve task/project/label references and independent sessions. Legacy activity workSessionId values are accepted but ignored, even if the referenced session is absent. Enforce temporal, ownership, identity and one-running-timer/session rules; split multi-day activities at local day boundaries. Never overwrite records or change the account time zone. Limits: 10,000 per type and 20 MiB.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransferSnapshot"
              }
            }
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "operationId": "getOpenApi",
        "summary": "Read this public API contract",
        "security": [],
        "responses": {
          "200": {
            "description": "OpenAPI 3.1 JSON document.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/server": {
      "get": {
        "operationId": "getServerInformation",
        "summary": "Read the serving server build and deployment information",
        "x-required-permission": "read",
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "responses": {
          "200": {
            "description": "Immutable build information and runtime deployment/start timestamps. Deployment time is null when it has not been recorded. During rolling updates this describes the replica serving the request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerInformation"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          }
        }
      }
    },
    "/work-sessions": {
      "get": {
        "operationId": "listWorkSessions",
        "summary": "List owned work sessions",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkSessionPage"
                }
              }
            },
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/Query"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "name": "clientId",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/Id"
            },
            "description": "Only records belonging to this client."
          },
          {
            "name": "projectId",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/Id"
            },
            "description": "Filter by an owned project."
          },
          {
            "name": "labelId",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/Id"
            },
            "description": "Only work sessions assigned this owned label."
          }
        ],
        "tags": [
          "WorkSessions"
        ]
      },
      "post": {
        "operationId": "createWorkSession",
        "summary": "Create a work session with recorded times",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkSession"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "Location": {
                "schema": {
                  "type": "string"
                },
                "description": "Relative or same-origin /api/v1 resource URL."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkSessionInput"
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "tags": [
          "WorkSessions"
        ]
      }
    },
    "/work-sessions/{id}": {
      "get": {
        "operationId": "getWorkSession",
        "summary": "Read a work session",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkSession"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "tags": [
          "WorkSessions"
        ]
      },
      "put": {
        "operationId": "updateWorkSession",
        "summary": "Adjust a work session",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkSession"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "X-Timekeeper-Undo-Id": {
                "schema": {
                  "$ref": "#/components/schemas/Id"
                }
              },
              "X-Timekeeper-Undo-Seconds": {
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 600
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "$ref": "#/components/parameters/UndoPreference"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkSessionInput"
              }
            }
          }
        },
        "tags": [
          "WorkSessions"
        ]
      },
      "delete": {
        "operationId": "deleteWorkSession",
        "summary": "Delete a work session, leaving activities unchanged",
        "x-required-permission": "write",
        "responses": {
          "204": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "X-Timekeeper-Undo-Id": {
                "schema": {
                  "$ref": "#/components/schemas/Id"
                }
              },
              "X-Timekeeper-Undo-Seconds": {
                "schema": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 600
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "$ref": "#/components/parameters/UndoPreference"
          }
        ],
        "tags": [
          "WorkSessions"
        ]
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ]
    },
    "/work-sessions/active": {
      "get": {
        "operationId": "getActiveWorkSession",
        "summary": "Read the running work session",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkSession"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "204": {
            "description": "No open activity for this owner.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "tags": [
          "WorkSessions"
        ]
      }
    },
    "/work-sessions/start": {
      "post": {
        "operationId": "startWorkSession",
        "summary": "Start an independent work session",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkSession"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "Location": {
                "schema": {
                  "type": "string"
                },
                "description": "Relative or same-origin /api/v1 resource URL."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/StartWorkSessionInput"
              }
            }
          }
        },
        "tags": [
          "WorkSessions"
        ],
        "description": "Start an independent work session. A user may have only one running session. Same-key replay returns the original response. Midnight and activity controls never stop a session."
      }
    },
    "/work-sessions/{id}/stop": {
      "post": {
        "operationId": "stopWorkSession",
        "summary": "Stop a work session",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkSession"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "tags": [
          "WorkSessions"
        ],
        "description": "Stop only this session, leaving associated activities unchanged. Same-key replay returns the original response and ETag. A new key with the current ETag of a stopped session returns it unchanged."
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ]
    },
    "/activities/{id}/work-session": {
      "put": {
        "operationId": "associateWorkSession",
        "summary": "Legacy detach operation",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkSessionAssociation"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WorkSessionAssociationInput"
              }
            }
          }
        },
        "tags": [
          "WorkSessions"
        ],
        "description": "Manual associations are retired. A non-null workSessionId returns 409 without changing the activity. A null value returns the current activity without a link. Owner authorization and If-Match still apply.",
        "deprecated": true
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ]
    },
    "/work-sessions/{id}/report": {
      "get": {
        "operationId": "reportWorkSession",
        "summary": "Calculate exact session coverage and unallocated time",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WorkSessionReport"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "tags": [
          "WorkSessions"
        ],
        "description": "Read the session and that owner’s overlapping activities, including running timers, in one owner-locked snapshot. Sum only each activity’s overlap; covered time is the union of those overlaps. Session changes automatically recompute context without altering activities. No explicit association is used."
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ]
    },
    "/clients": {
      "get": {
        "operationId": "listClients",
        "summary": "List owned clients",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ClientPage"
                }
              }
            },
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Limit"
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/Query"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "post": {
        "operationId": "createClient",
        "summary": "Create owned client",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Client"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "Location": {
                "schema": {
                  "type": "string"
                },
                "description": "Relative or same-origin /api/v1 resource URL."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClientInput"
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/clients/{id}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ],
      "get": {
        "operationId": "getClient",
        "summary": "Read owned client",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Client"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "put": {
        "operationId": "updateClient",
        "summary": "Replace editable client fields",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Client"
                }
              }
            },
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ClientInput"
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteClient",
        "summary": "Delete unused owned client",
        "x-required-permission": "write",
        "responses": {
          "204": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ]
      }
    },
    "/auth/status": {
      "get": {
        "operationId": "getAuthStatus",
        "summary": "getAuthStatus",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthStatus"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [],
        "security": []
      }
    },
    "/auth/login": {
      "post": {
        "operationId": "login",
        "summary": "login",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthSession"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        },
        "parameters": [],
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginInput"
              }
            }
          }
        }
      }
    },
    "/auth/setup": {
      "post": {
        "operationId": "setupAccount",
        "summary": "setupAccount",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthSession"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        },
        "parameters": [],
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailSetupInput"
              }
            }
          }
        }
      }
    },
    "/auth/recover": {
      "post": {
        "operationId": "recoverAccount",
        "summary": "recoverAccount",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthSession"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        },
        "parameters": [],
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SetupInput"
              }
            }
          }
        }
      }
    },
    "/auth/token-login": {
      "post": {
        "operationId": "exchangeApiToken",
        "summary": "exchangeApiToken",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthSession"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "x-required-permission": "read"
      }
    },
    "/auth/session": {
      "get": {
        "operationId": "getAuthSession",
        "summary": "getAuthSession",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthSession"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "x-required-permission": "read"
      }
    },
    "/auth/logout": {
      "post": {
        "operationId": "logout",
        "summary": "logout",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "204": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "x-required-permission": "read"
      }
    },
    "/auth/account": {
      "get": {
        "operationId": "getAccount",
        "summary": "getAccount",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Account"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "x-required-permission": "read"
      },
      "put": {
        "operationId": "updateAccount",
        "summary": "updateAccount",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Account"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "428": {
            "$ref": "#/components/responses/428"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountInput"
              }
            }
          }
        }
      }
    },
    "/auth/password": {
      "post": {
        "operationId": "changePassword",
        "summary": "changePassword",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "204": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasswordInput"
              }
            }
          }
        }
      }
    },
    "/auth/tokens": {
      "get": {
        "operationId": "listPersonalTokens",
        "summary": "listPersonalTokens",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenList"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "x-required-permission": "read"
      },
      "post": {
        "operationId": "createPersonalToken",
        "summary": "createPersonalToken",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TokenIssued"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TokenInput"
              }
            }
          }
        }
      }
    },
    "/auth/tokens/{id}": {
      "delete": {
        "operationId": "revokePersonalToken",
        "summary": "revokePersonalToken",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "204": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "x-required-permission": "write"
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ]
    },
    "/admin/users": {
      "get": {
        "operationId": "listUserAccounts",
        "summary": "listUserAccounts",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserList"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "x-required-permission": "write"
      },
      "post": {
        "operationId": "createUserAccount",
        "summary": "createUserAccount",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "201": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReply"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserCreateInput"
              }
            }
          }
        }
      }
    },
    "/admin/users/{key}": {
      "get": {
        "operationId": "getUserAccount",
        "summary": "getUserAccount",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReply"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "x-required-permission": "write"
      },
      "put": {
        "operationId": "updateUserAccount",
        "summary": "updateUserAccount",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UserReply"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "428": {
            "$ref": "#/components/responses/428"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UserInput"
              }
            }
          }
        }
      },
      "parameters": [
        {
          "$ref": "#/components/parameters/AccountKey"
        }
      ]
    },
    "/auth/email/forgot": {
      "post": {
        "operationId": "requestEmailRecovery",
        "summary": "requestEmailRecovery",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "202": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmailForgotResult"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            }
          }
        },
        "parameters": [],
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailForgotInput"
              }
            }
          }
        }
      }
    },
    "/auth/email/preview": {
      "post": {
        "operationId": "previewEmailLink",
        "summary": "previewEmailLink",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "204": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            }
          }
        },
        "parameters": [],
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailLinkInput"
              }
            }
          }
        }
      }
    },
    "/auth/email/verify": {
      "post": {
        "operationId": "verifyRecoveryEmail",
        "summary": "verifyRecoveryEmail",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "204": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            }
          }
        },
        "parameters": [],
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailTokenInput"
              }
            }
          }
        }
      }
    },
    "/auth/email/reset": {
      "post": {
        "operationId": "resetPasswordByEmail",
        "summary": "resetPasswordByEmail",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "204": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            }
          }
        },
        "parameters": [],
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailResetInput"
              }
            }
          }
        }
      }
    },
    "/auth/email/addresses/{slot}": {
      "get": {
        "operationId": "getRecoveryEmail",
        "summary": "getRecoveryEmail",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecoveryAddress"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "name": "slot",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "PRIMARY",
                "BACKUP"
              ]
            }
          }
        ],
        "x-required-permission": "read"
      },
      "put": {
        "operationId": "changeRecoveryEmail",
        "summary": "changeRecoveryEmail",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecoveryAddress"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "428": {
            "$ref": "#/components/responses/428"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "name": "slot",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "PRIMARY",
                "BACKUP"
              ]
            }
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RecoveryAddressInput"
              }
            }
          }
        }
      }
    },
    "/auth/email/addresses/{slot}/resend": {
      "post": {
        "operationId": "resendRecoveryEmailVerification",
        "summary": "resendRecoveryEmailVerification",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "202": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": false
                }
              }
            }
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "name": "slot",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "PRIMARY",
                "BACKUP"
              ]
            }
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EmailResendInput"
              }
            }
          }
        }
      }
    },
    "/imports": {
      "get": {
        "operationId": "listImportJobs",
        "summary": "List private import history",
        "description": "Owner-scoped stable ID order. Follow nextAfter to retrieve further jobs; clients may sort fetched jobs by createdAt.",
        "x-required-permission": "read",
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "after",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/Id"
            }
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportHistoryPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        }
      }
    },
    "/imports/toggl/preview": {
      "post": {
        "operationId": "previewTogglImport",
        "summary": "Review normalized Track rows without writing data",
        "description": "",
        "x-required-permission": "write",
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportReview"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TogglImportPreviewInput"
              }
            }
          }
        }
      }
    },
    "/imports/toggl/jobs": {
      "post": {
        "operationId": "createTogglImportJob",
        "summary": "Create an immutable reviewed Track import job",
        "description": "Creates private job authority and mappings only, with no client/project/task/label/activity creation. Source identity is a hash of the selected source member and workspace, never an account owner override. At most 100,000 selected entries. Work sessions are not inferred.",
        "x-required-permission": "write",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "responses": {
          "201": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportJob"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TogglImportJobInput"
              }
            }
          }
        }
      }
    },
    "/imports/jobs/{id}": {
      "get": {
        "operationId": "getImportJob",
        "summary": "Get authoritative import progress and immutable mappings",
        "description": "",
        "x-required-permission": "read",
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportJob"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        }
      }
    },
    "/imports/jobs/{id}/items": {
      "get": {
        "operationId": "listImportItems",
        "summary": "Read bounded import audit and lineage",
        "description": "",
        "x-required-permission": "read",
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          },
          {
            "name": "offset",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 100
            }
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportItemPage"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        }
      }
    },
    "/imports/jobs/{id}/preview": {
      "post": {
        "operationId": "previewTogglImportBatch",
        "summary": "Review the next import batch",
        "description": "",
        "x-required-permission": "write",
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportReview"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TogglImportRowsInput"
              }
            }
          }
        }
      }
    },
    "/imports/jobs/{id}/batches/{index}": {
      "post": {
        "operationId": "commitTogglImportBatch",
        "summary": "Atomically commit a durable import batch",
        "description": "At most 100 completed source entries and 1,000 resulting daily activities. Source and account zones are distinct; a changed account zone requires new review. A finished batch must reconcile selected entry count and exact imported plus skipped source nanoseconds. Active provenance reuses current records without overwriting edits; ambiguous existing matches require explicit CREATE_DISTINCT or reviewed REUSE choices.",
        "x-required-permission": "write",
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          },
          {
            "name": "index",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100000
            }
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportBatchResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TogglImportBatchInput"
              }
            }
          }
        }
      }
    },
    "/imports/jobs/{id}/undo": {
      "post": {
        "operationId": "beginImportUndo",
        "summary": "Fence all further writes before whole-job Undo",
        "description": "Confirm the whole-job operation before starting. Supports partially completed imports. The returned job is UNDOING; repeat previews and bounded commits until complete or retained conflicts are explicitly resolved.",
        "x-required-permission": "write",
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportJob"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        }
      }
    },
    "/imports/jobs/{id}/undo/preview": {
      "get": {
        "operationId": "previewImportUndoBatch",
        "summary": "Review the next bounded Undo step",
        "description": "At most 100 records. DELETE is unchanged and removable; REVIEW needs explicit KEEP or DELETE. REFERENCED, RUNNING and DEPENDENCY require KEEP or resolving the blocker outside Undo. REUSED records are preserved and MISSING records are reconciled. Catalog children commit before parent dependency review.",
        "x-required-permission": "read",
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportReview"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        }
      }
    },
    "/imports/jobs/{id}/undo/batches/{index}": {
      "post": {
        "operationId": "commitImportUndoBatch",
        "summary": "Commit a reviewed resumable Undo step",
        "description": "Rechecks the exact preview under the owner lock, including versions and dependencies. Deletes only records created by this job through normal domain notifications. UNDONE_PARTIAL identifies deliberately retained created records. Source claims remain for retained records; removing all created parts releases that original claim for deliberate re-import. Cached replies never repeat deletion.",
        "x-required-permission": "write",
        "parameters": [
          {
            "$ref": "#/components/parameters/Id"
          },
          {
            "name": "index",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 2147483646
            }
          },
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportBatchResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImportUndoBatchInput"
              }
            }
          }
        }
      }
    },
    "/auth/passkeys/login/options": {
      "post": {
        "operationId": "passkeyLoginOptions",
        "summary": "passkeyLoginOptions",
        "tags": [
          "Passkeys"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "200": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasskeyOptions"
                }
              }
            }
          }
        },
        "parameters": [],
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasskeyLoginInput"
              }
            }
          }
        },
        "description": "Requires the exact configured HTTPS origin and a host-only HttpOnly browser-binding cookie from GET /auth/status. Credential-management routes additionally require an account browser session; API tokens and token-derived sessions cannot manage passkeys. Completion JSON is limited to 98,304 UTF-8 bytes."
      }
    },
    "/auth/passkeys/login/finish": {
      "post": {
        "operationId": "passkeyLogin",
        "summary": "passkeyLogin",
        "tags": [
          "Passkeys"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "200": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AuthSession"
                }
              }
            }
          }
        },
        "parameters": [],
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasskeyAssertionFinish"
              }
            }
          }
        },
        "description": "Requires the exact configured HTTPS origin and a host-only HttpOnly browser-binding cookie from GET /auth/status. Credential-management routes additionally require an account browser session; API tokens and token-derived sessions cannot manage passkeys. Completion JSON is limited to 98,304 UTF-8 bytes."
      }
    },
    "/auth/passkeys/cancel": {
      "post": {
        "operationId": "cancelPasskeyCeremonies",
        "summary": "cancelPasskeyCeremonies",
        "tags": [
          "Passkeys"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "204": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              }
            }
          }
        },
        "parameters": [],
        "security": [],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasskeyCancelInput"
              }
            }
          }
        },
        "description": "Requires the exact configured HTTPS origin and a host-only HttpOnly browser-binding cookie from GET /auth/status. Credential-management routes additionally require an account browser session; API tokens and token-derived sessions cannot manage passkeys. Completion JSON is limited to 98,304 UTF-8 bytes."
      }
    },
    "/auth/passkeys": {
      "get": {
        "operationId": "listPasskeys",
        "summary": "listPasskeys",
        "tags": [
          "Passkeys"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "200": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasskeyList"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "x-required-permission": "read",
        "description": "Requires the exact configured HTTPS origin and a host-only HttpOnly browser-binding cookie from GET /auth/status. Credential-management routes additionally require an account browser session; API tokens and token-derived sessions cannot manage passkeys. Completion JSON is limited to 98,304 UTF-8 bytes."
      }
    },
    "/auth/passkeys/register/options": {
      "post": {
        "operationId": "passkeyRegistrationOptions",
        "summary": "passkeyRegistrationOptions",
        "tags": [
          "Passkeys"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "200": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasskeyOptions"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasskeyRegisterInput"
              }
            }
          }
        },
        "description": "Requires the exact configured HTTPS origin and a host-only HttpOnly browser-binding cookie from GET /auth/status. Credential-management routes additionally require an account browser session; API tokens and token-derived sessions cannot manage passkeys. Completion JSON is limited to 98,304 UTF-8 bytes."
      }
    },
    "/auth/passkeys/register/finish": {
      "post": {
        "operationId": "registerPasskey",
        "summary": "registerPasskey",
        "tags": [
          "Passkeys"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "201": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasskeyCredential"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasskeyRegistrationFinish"
              }
            }
          }
        },
        "description": "Requires the exact configured HTTPS origin and a host-only HttpOnly browser-binding cookie from GET /auth/status. Credential-management routes additionally require an account browser session; API tokens and token-derived sessions cannot manage passkeys. Completion JSON is limited to 98,304 UTF-8 bytes."
      }
    },
    "/auth/passkeys/proof/options": {
      "post": {
        "operationId": "passkeyProofOptions",
        "summary": "passkeyProofOptions",
        "tags": [
          "Passkeys"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "200": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasskeyOptions"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasskeyActionInput"
              }
            }
          }
        },
        "description": "Requires the exact configured HTTPS origin and a host-only HttpOnly browser-binding cookie from GET /auth/status. Credential-management routes additionally require an account browser session; API tokens and token-derived sessions cannot manage passkeys. Completion JSON is limited to 98,304 UTF-8 bytes."
      }
    },
    "/auth/passkeys/proof/finish": {
      "post": {
        "operationId": "verifyPasskeyProof",
        "summary": "verifyPasskeyProof",
        "tags": [
          "Passkeys"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "200": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasskeyProofIssued"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasskeyAssertionFinish"
              }
            }
          }
        },
        "description": "Requires the exact configured HTTPS origin and a host-only HttpOnly browser-binding cookie from GET /auth/status. Credential-management routes additionally require an account browser session; API tokens and token-derived sessions cannot manage passkeys. Completion JSON is limited to 98,304 UTF-8 bytes."
      }
    },
    "/auth/passkeys/{id}": {
      "put": {
        "operationId": "renamePasskey",
        "summary": "renamePasskey",
        "tags": [
          "Passkeys"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "200": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "schema": {
                  "type": "string",
                  "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
                },
                "description": "Strong opaque tag for this canonical resource representation; echo it in If-Match. Do not construct it from the JSON version."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasskeyCredential"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "428": {
            "$ref": "#/components/responses/428"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasskeyNameInput"
              }
            }
          }
        },
        "description": "Requires the exact configured HTTPS origin and a host-only HttpOnly browser-binding cookie from GET /auth/status. Credential-management routes additionally require an account browser session; API tokens and token-derived sessions cannot manage passkeys. Completion JSON is limited to 98,304 UTF-8 bytes."
      },
      "delete": {
        "operationId": "removePasskey",
        "summary": "removePasskey",
        "tags": [
          "Passkeys"
        ],
        "responses": {
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "200": {
            "description": "Successful operation.",
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PasskeyRemoved"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/429"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "428": {
            "$ref": "#/components/responses/428"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "x-required-permission": "write",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PasskeyProofInput"
              }
            }
          }
        },
        "description": "Requires the exact configured HTTPS origin and a host-only HttpOnly browser-binding cookie from GET /auth/status. Credential-management routes additionally require an account browser session; API tokens and token-derived sessions cannot manage passkeys. Completion JSON is limited to 98,304 UTF-8 bytes."
      }
    },
    "/admin/settings": {
      "get": {
        "operationId": "getAdministrationSettings",
        "summary": "Read saved and effective service settings",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdministrationSettings"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Opaque version required by If-Match on saves."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "x-required-permission": "write",
        "description": "Administrator-only redacted desired/effective configuration. Secrets are never returned. Changes require current administrator account proof and a coordinated restart."
      },
      "put": {
        "operationId": "updateAdministrationSettings",
        "summary": "Save service settings for activation at coordinated restart",
        "tags": [
          "Accounts"
        ],
        "responses": {
          "200": {
            "description": "Successful operation.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdministrationSettings"
                }
              }
            },
            "headers": {
              "Cache-Control": {
                "schema": {
                  "const": "no-store"
                },
                "description": "Authentication responses must not be cached."
              },
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "schema": {
                  "type": "string"
                },
                "description": "Opaque version required by If-Match on saves."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "503": {
            "$ref": "#/components/responses/503"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "429": {
            "$ref": "#/components/responses/429"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "x-required-permission": "write",
        "description": "Administrator-only redacted desired/effective configuration. Secrets are never returned. Changes require current administrator account proof and a coordinated restart.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdministrationSettingsInput"
              }
            }
          }
        }
      }
    },
    "/data/account/export": {
      "get": {
        "operationId": "downloadAccountArchive",
        "summary": "Download the signed-in account as a complete private JSON/CSV ZIP",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/zip": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ],
        "description": "One consistent owner-scoped snapshot, including when the caller is an administrator. No list-page, 10,000-record or 20 MiB export truncation. Includes work, preferences, account/credential-management metadata and inert import audit. Excludes all credential material and global settings/secrets."
      }
    },
    "/data/account/uploads": {
      "post": {
        "operationId": "createAccountArchiveUpload",
        "summary": "Prepare a private archive upload without changing work records",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "description": "Opaque version for conditional review/commit.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountArchiveUpload"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountArchiveUploadInput"
              }
            }
          }
        }
      },
      "get": {
        "operationId": "listPendingAccountArchives",
        "summary": "List this account’s resumable archive uploads",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountArchivePendingUploads"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      }
    },
    "/data/account/uploads/{id}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ],
      "get": {
        "operationId": "getAccountArchiveUpload",
        "summary": "Read private archive upload progress",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "description": "Opaque version for conditional review/commit.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountArchiveUpload"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          }
        ]
      },
      "delete": {
        "operationId": "discardAccountArchiveUpload",
        "summary": "Discard private staging data",
        "x-required-permission": "write",
        "responses": {
          "204": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ]
      }
    },
    "/data/account/uploads/{id}/chunks/{index}": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        },
        {
          "name": "index",
          "in": "path",
          "required": true,
          "schema": {
            "type": "integer",
            "minimum": 0,
            "maximum": 255
          }
        }
      ],
      "put": {
        "operationId": "writeAccountArchiveChunk",
        "summary": "Upload the exact next chunk or replay identical bytes",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "description": "Opaque version for conditional review/commit.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountArchiveUpload"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountArchiveChunkInput"
              }
            }
          }
        }
      }
    },
    "/data/account/uploads/{id}/preview": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ],
      "post": {
        "operationId": "previewAccountArchive",
        "summary": "Validate and review a complete account archive before restoring it",
        "x-required-permission": "write",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              },
              "ETag": {
                "description": "Opaque version for conditional review/commit.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountArchivePreview"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountArchiveReviewInput"
              }
            }
          }
        }
      }
    },
    "/data/account/uploads/{id}/import": {
      "parameters": [
        {
          "$ref": "#/components/parameters/Id"
        }
      ],
      "post": {
        "operationId": "restoreAccountArchive",
        "summary": "Atomically restore reviewed work and selected preferences into this account",
        "x-required-permission": "write",
        "responses": {
          "201": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountArchiveRestoreResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "$ref": "#/components/parameters/Csrf"
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccountArchiveReviewInput"
              }
            }
          }
        },
        "description": "Requires the upload ETag from preview and an unchanged target revision/profile. Remaps all work IDs and links; never changes account identity, roles, email or credentials. Old import history is retained only as inert audit. A durable owner-scoped receipt derived from the verified archive ID, with its JSON digest as the replay fingerprint returns the prior result after lost replies/reselection, before stale-version checks. Existing work is retained. Files and uncompressed JSON are bounded to 256 MiB; each request remains below the existing global body limit."
      }
    },
    "/data/account/imports": {
      "get": {
        "operationId": "listAccountArchiveRestores",
        "summary": "List this account’s completed archive restores",
        "x-required-permission": "read",
        "responses": {
          "200": {
            "description": "Successful operation.",
            "headers": {
              "X-Timekeeper-Owner": {
                "schema": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_-]+$"
                },
                "description": "Canonical unpadded base64url UTF-8 authenticated owner ID, available even for empty pages and 204 responses. Bind subsequent session requests to this owner."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountArchiveHistory"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "412": {
            "$ref": "#/components/responses/412"
          },
          "413": {
            "$ref": "#/components/responses/413"
          },
          "415": {
            "$ref": "#/components/responses/415"
          },
          "422": {
            "$ref": "#/components/responses/422"
          },
          "428": {
            "$ref": "#/components/responses/428"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/OwnerBinding"
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "after",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/Id"
            }
          }
        ]
      }
    },
    "/undo/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "$ref": "#/components/schemas/Id"
          }
        }
      ],
      "post": {
        "operationId": "undoWorkSessionChange",
        "summary": "Undo an offered work-session edit or deletion",
        "description": "The owner-scoped offer expires after ten minutes. Undo checks the exact post-change version and current owned references, restores the same ID with a higher version, and leaves activities unchanged. Only the most recent acknowledged browser mutation is offered in the UI.",
        "x-required-permission": "write",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UndoInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Original work session restored with a new version; repeated commands return their previous result.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UndoResult"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/400"
          },
          "401": {
            "$ref": "#/components/responses/401"
          },
          "403": {
            "$ref": "#/components/responses/403"
          },
          "404": {
            "$ref": "#/components/responses/404"
          },
          "409": {
            "$ref": "#/components/responses/409"
          },
          "410": {
            "$ref": "#/components/responses/410"
          },
          "503": {
            "$ref": "#/components/responses/503"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Bearer token resolves to one stable server owner and read/write permissions. Never accept owner IDs from clients. TLS is required outside loopback development."
      },
      "browserSession": {
        "type": "apiKey",
        "in": "cookie",
        "name": "__Host-timekeeper-session",
        "description": "Opaque HttpOnly; Secure; SameSite=Lax cookie. Configured HTTPS browser requests require the exact canonical Origin, or a matching Referer origin on reads. Unsafe cookie requests also require X-CSRF-Token. A separate host-only HttpOnly browser-binding cookie is issued by same-origin GET /auth/status and refreshed on sign-in. Bearer API/Eclipse requests remain origin-independent; /auth/token-login explicitly exchanges a bearer token for a bound browser session."
      }
    },
    "schemas": {
      "Id": {
        "type": "string",
        "format": "uuid"
      },
      "OwnerId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "Version": {
        "type": "integer",
        "minimum": 0,
        "maximum": 9007199254740991
      },
      "Instant": {
        "type": "string",
        "format": "date-time",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?Z$",
        "description": "UTC RFC 3339 timestamp, up to nine fractional digits; no local or offset-only timestamps."
      },
      "ZoneId": {
        "type": "string",
        "minLength": 1,
        "maxLength": 100,
        "description": "Valid IANA TZDB zone ID, for example Europe/Oslo or UTC. Unknown IDs are rejected with 422."
      },
      "Duration": {
        "type": "string",
        "pattern": "^PT(?=\\d)(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d{1,9})?S)?$",
        "description": "Nonnegative ISO 8601 time-based duration with nanosecond precision, for example PT1H30M or PT0S. Durations exceeding a day use total hours."
      },
      "Name": {
        "type": "string",
        "minLength": 1,
        "maxLength": 1000,
        "pattern": "\\S"
      },
      "Summary": {
        "type": "string",
        "maxLength": 2000
      },
      "Url": {
        "type": "string",
        "format": "uri",
        "maxLength": 4096
      },
      "Color": {
        "type": "string",
        "pattern": "^#[0-9A-Fa-f]{6}$"
      },
      "ExternalReference": {
        "type": "object",
        "properties": {
          "providerId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "pattern": "\\S"
          },
          "repositoryId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4096,
            "pattern": "\\S"
          },
          "externalId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1000,
            "pattern": "\\S"
          },
          "externalUrl": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Url"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "providerId",
          "repositoryId",
          "externalId",
          "externalUrl"
        ],
        "additionalProperties": false
      },
      "ProjectInput": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "clientId": {
            "$ref": "#/components/schemas/Id"
          },
          "icon": {
            "$ref": "#/components/schemas/ProjectIcon"
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false,
        "description": "clientId selects the owner-scoped client. Legacy clients may omit it: creation uses General and edits preserve the existing client."
      },
      "TaskInput": {
        "type": "object",
        "properties": {
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "parentTaskId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/Name"
          },
          "url": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Url"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "projectId",
          "parentTaskId",
          "summary",
          "url"
        ],
        "additionalProperties": false
      },
      "LabelInput": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "color": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Color"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "name",
          "color"
        ],
        "additionalProperties": false
      },
      "ActivityInput": {
        "type": "object",
        "description": "A recorded interval. Start must not be after the backend clock, whether the interval is open or closed; a future start returns 422 VALIDATION.",
        "properties": {
          "taskId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "start": {
            "$ref": "#/components/schemas/Instant"
          },
          "end": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/Summary"
          },
          "labelIds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Id"
            },
            "uniqueItems": true,
            "maxItems": 500
          },
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "workSessionId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired legacy field. Accepted for compatibility but ignored; work-session context is derived from time overlap."
          }
        },
        "required": [
          "taskId",
          "start",
          "end",
          "summary",
          "labelIds"
        ],
        "additionalProperties": false
      },
      "ActivityUpdate": {
        "type": "object",
        "description": "Edit a recorded interval. Start must not be after the backend clock; invalid edits do not change records or versions.",
        "properties": {
          "start": {
            "$ref": "#/components/schemas/Instant"
          },
          "end": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/Summary"
          },
          "labelIds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Id"
            },
            "uniqueItems": true,
            "maxItems": 500
          }
        },
        "required": [
          "start",
          "end",
          "summary",
          "labelIds"
        ],
        "additionalProperties": false
      },
      "StartActivityInput": {
        "type": "object",
        "properties": {
          "taskId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/Summary"
          },
          "labelIds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Id"
            },
            "uniqueItems": true,
            "maxItems": 500
          },
          "expectedActiveId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "expectedActiveVersion": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Version"
              },
              {
                "type": "null"
              }
            ]
          },
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "workSessionId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired legacy field. Accepted for compatibility but ignored; work-session context is derived from time overlap."
          }
        },
        "required": [
          "taskId",
          "summary",
          "labelIds",
          "expectedActiveId",
          "expectedActiveVersion"
        ],
        "additionalProperties": false
      },
      "ProfileInput": {
        "type": "object",
        "properties": {
          "zoneId": {
            "$ref": "#/components/schemas/ZoneId"
          }
        },
        "required": [
          "zoneId"
        ],
        "additionalProperties": false
      },
      "Problem": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer",
            "minimum": 400,
            "maximum": 599
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string",
            "pattern": "^[A-Z][A-Z0-9_]*$"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "field": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              },
              "required": [
                "field",
                "message"
              ],
              "additionalProperties": true
            }
          }
        },
        "required": [
          "type",
          "title",
          "status",
          "code"
        ],
        "additionalProperties": true
      },
      "Project": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "clientId": {
            "$ref": "#/components/schemas/Id"
          },
          "icon": {
            "$ref": "#/components/schemas/ProjectIcon"
          }
        },
        "required": [
          "id",
          "ownerId",
          "version",
          "name",
          "clientId"
        ],
        "additionalProperties": true
      },
      "Task": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "parentTaskId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/Name"
          },
          "url": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Url"
              },
              {
                "type": "null"
              }
            ]
          },
          "externalReferences": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalReferenceSnapshot"
            },
            "uniqueItems": true
          }
        },
        "required": [
          "id",
          "ownerId",
          "version",
          "projectId",
          "parentTaskId",
          "summary",
          "url",
          "externalReferences"
        ],
        "additionalProperties": true
      },
      "Label": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "color": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Color"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "ownerId",
          "version",
          "name",
          "color"
        ],
        "additionalProperties": true
      },
      "Activity": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "taskId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "start": {
            "$ref": "#/components/schemas/Instant"
          },
          "end": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/Summary"
          },
          "labelIds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Id"
            },
            "uniqueItems": true,
            "maxItems": 500
          },
          "manual": {
            "type": "boolean"
          },
          "workSessionId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired legacy field. Accepted for compatibility but ignored; work-session context is derived from time overlap."
          },
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "ownerId",
          "version",
          "taskId",
          "start",
          "end",
          "summary",
          "labelIds",
          "manual"
        ],
        "additionalProperties": true
      },
      "Profile": {
        "type": "object",
        "properties": {
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "zoneId": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "ownerId",
          "zoneId",
          "version"
        ],
        "additionalProperties": true
      },
      "ProjectPage": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Project"
            }
          },
          "nextCursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "items",
          "nextCursor",
          "revision"
        ],
        "additionalProperties": true
      },
      "TaskPage": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Task"
            }
          },
          "nextCursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "items",
          "nextCursor",
          "revision"
        ],
        "additionalProperties": true
      },
      "LabelPage": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Label"
            }
          },
          "nextCursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "items",
          "nextCursor",
          "revision"
        ],
        "additionalProperties": true
      },
      "ActivityPage": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Activity"
            }
          },
          "nextCursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "items",
          "nextCursor",
          "revision"
        ],
        "additionalProperties": true
      },
      "Report": {
        "type": "object",
        "properties": {
          "from": {
            "$ref": "#/components/schemas/Instant"
          },
          "to": {
            "$ref": "#/components/schemas/Instant"
          },
          "zoneId": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "generatedAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          },
          "total": {
            "$ref": "#/components/schemas/Duration"
          },
          "days": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date"
                },
                "total": {
                  "$ref": "#/components/schemas/Duration"
                },
                "tasks": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "taskId": {
                        "anyOf": [
                          {
                            "$ref": "#/components/schemas/Id"
                          },
                          {
                            "type": "null"
                          }
                        ]
                      },
                      "total": {
                        "$ref": "#/components/schemas/Duration"
                      }
                    },
                    "required": [
                      "taskId",
                      "total"
                    ],
                    "additionalProperties": true
                  }
                }
              },
              "required": [
                "date",
                "total",
                "tasks"
              ],
              "additionalProperties": true
            }
          }
        },
        "required": [
          "from",
          "to",
          "zoneId",
          "generatedAt",
          "revision",
          "total",
          "days"
        ],
        "additionalProperties": true
      },
      "Change": {
        "type": "object",
        "properties": {
          "sequence": {
            "$ref": "#/components/schemas/Version"
          },
          "entityType": {
            "type": "string",
            "enum": [
              "PROJECT",
              "TASK",
              "ACTIVITY",
              "LABEL",
              "PROFILE",
              "WORK_SESSION",
              "CLIENT"
            ]
          },
          "changeType": {
            "type": "string",
            "enum": [
              "CREATED",
              "UPDATED",
              "DELETED"
            ]
          },
          "entityId": {
            "type": "string"
          },
          "occurredAt": {
            "$ref": "#/components/schemas/Instant"
          }
        },
        "required": [
          "sequence",
          "entityType",
          "changeType",
          "entityId",
          "occurredAt"
        ],
        "additionalProperties": true
      },
      "ChangePage": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Change"
            }
          },
          "nextSequence": {
            "$ref": "#/components/schemas/Version"
          },
          "hasMore": {
            "type": "boolean"
          }
        },
        "required": [
          "items",
          "nextSequence",
          "hasMore"
        ],
        "additionalProperties": true
      },
      "TransferProject": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "clientId": {
            "$ref": "#/components/schemas/Id"
          },
          "icon": {
            "$ref": "#/components/schemas/ProjectIcon"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      },
      "TransferTask": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "parentTaskId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/Name"
          },
          "url": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Url"
              },
              {
                "type": "null"
              }
            ]
          },
          "externalReferences": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalReference"
            },
            "uniqueItems": true
          }
        },
        "required": [
          "id",
          "projectId",
          "parentTaskId",
          "summary",
          "url",
          "externalReferences"
        ],
        "additionalProperties": false
      },
      "TransferLabel": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "color": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Color"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "name",
          "color"
        ],
        "additionalProperties": false
      },
      "TransferActivity": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "taskId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "start": {
            "$ref": "#/components/schemas/Instant"
          },
          "end": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/Summary"
          },
          "labelIds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Id"
            },
            "uniqueItems": true,
            "maxItems": 500
          },
          "manual": {
            "type": "boolean"
          },
          "workSessionId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired legacy field. Accepted for compatibility but ignored; work-session context is derived from time overlap."
          },
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "taskId",
          "start",
          "end",
          "summary",
          "labelIds",
          "manual"
        ],
        "additionalProperties": false
      },
      "TransferSnapshot": {
        "type": "object",
        "properties": {
          "format": {
            "type": "string",
            "enum": [
              "timekeeper-domain-v1",
              "timekeeper-domain-v2",
              "timekeeper-domain-v3"
            ]
          },
          "zoneId": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferProject"
            },
            "maxItems": 10000
          },
          "tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferTask"
            },
            "maxItems": 10000
          },
          "labels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferLabel"
            },
            "maxItems": 10000
          },
          "activities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferActivity"
            },
            "maxItems": 10000
          },
          "workSessions": {
            "type": "array",
            "maxItems": 10000,
            "items": {
              "$ref": "#/components/schemas/TransferWorkSession"
            }
          },
          "clients": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferClient"
            },
            "maxItems": 10000
          }
        },
        "required": [
          "format",
          "zoneId",
          "projects",
          "tasks",
          "labels",
          "activities"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "format": {
                  "const": "timekeeper-domain-v2"
                }
              }
            },
            "then": {
              "required": [
                "workSessions"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "format": {
                  "const": "timekeeper-domain-v1"
                }
              }
            },
            "then": {
              "properties": {
                "workSessions": {
                  "maxItems": 0
                },
                "activities": {
                  "items": {
                    "properties": {
                      "taskId": {
                        "$ref": "#/components/schemas/Id"
                      },
                      "workSessionId": {
                        "type": "null"
                      },
                      "projectId": {
                        "type": "null"
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "format": {
                  "const": "timekeeper-domain-v3"
                }
              }
            },
            "then": {
              "required": [
                "clients",
                "workSessions"
              ],
              "properties": {
                "projects": {
                  "items": {
                    "required": [
                      "clientId"
                    ]
                  }
                },
                "workSessions": {
                  "items": {
                    "required": [
                      "clientId"
                    ]
                  }
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "format": {
                  "enum": [
                    "timekeeper-domain-v1",
                    "timekeeper-domain-v2"
                  ]
                }
              }
            },
            "then": {
              "properties": {
                "clients": {
                  "maxItems": 0
                },
                "projects": {
                  "items": {
                    "not": {
                      "required": [
                        "clientId"
                      ]
                    }
                  }
                },
                "workSessions": {
                  "items": {
                    "not": {
                      "anyOf": [
                        {
                          "required": [
                            "clientId"
                          ]
                        },
                        {
                          "required": [
                            "title"
                          ]
                        },
                        {
                          "required": [
                            "projectId"
                          ]
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "ImportResult": {
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "entityType": {
                  "type": "string",
                  "enum": [
                    "PROJECT",
                    "TASK",
                    "ACTIVITY",
                    "LABEL",
                    "WORK_SESSION",
                    "CLIENT"
                  ]
                },
                "sourceId": {
                  "$ref": "#/components/schemas/Id"
                },
                "id": {
                  "$ref": "#/components/schemas/Id"
                }
              },
              "required": [
                "entityType",
                "sourceId",
                "id"
              ],
              "additionalProperties": true
            }
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "ids",
          "revision"
        ],
        "additionalProperties": true
      },
      "ExternalReferenceSnapshot": {
        "type": "object",
        "properties": {
          "providerId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "pattern": "\\S"
          },
          "repositoryId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 4096,
            "pattern": "\\S"
          },
          "externalId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1000,
            "pattern": "\\S"
          },
          "externalUrl": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Url"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "providerId",
          "repositoryId",
          "externalId",
          "externalUrl"
        ],
        "additionalProperties": true
      },
      "TaskCreateInput": {
        "type": "object",
        "properties": {
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "parentTaskId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/Name"
          },
          "url": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Url"
              },
              {
                "type": "null"
              }
            ]
          },
          "externalReferences": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExternalReference"
            },
            "uniqueItems": true,
            "maxItems": 500,
            "default": []
          }
        },
        "required": [
          "projectId",
          "parentTaskId",
          "summary",
          "url"
        ],
        "additionalProperties": false
      },
      "ServerInformation": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "version",
          "commit",
          "dirty",
          "builtAt",
          "deployedAt",
          "startedAt"
        ],
        "properties": {
          "version": {
            "type": "string"
          },
          "commit": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^[0-9a-f]{40}$"
          },
          "dirty": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether the build included modified source; null if not known."
          },
          "builtAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "deployedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Explicitly recorded deployment time; never inferred from process startup."
          },
          "startedAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "spkVersion": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+-[1-9][0-9]*$",
            "description": "Installed Synology SPK version; null for other deployment types."
          }
        }
      },
      "WorkSession": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "start": {
            "$ref": "#/components/schemas/Instant"
          },
          "end": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/WorkSessionSummary"
          },
          "state": {
            "type": "string",
            "enum": [
              "RUNNING",
              "COMPLETED"
            ]
          },
          "clientId": {
            "$ref": "#/components/schemas/Id"
          },
          "labelIds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Id"
            },
            "uniqueItems": true,
            "maxItems": 1000,
            "description": "Optional owner-owned labels. Omission preserves labels on edits; an empty array clears them. Older work sessions without this field have no labels."
          },
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ],
            "description": "Optional owner-owned project. Its client determines the session client. Omission preserves the project on edits; null clears it. Older sessions without this field have no project."
          }
        },
        "required": [
          "id",
          "ownerId",
          "version",
          "start",
          "end",
          "summary",
          "state",
          "clientId"
        ]
      },
      "WorkSessionInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "start": {
            "$ref": "#/components/schemas/Instant"
          },
          "end": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/WorkSessionSummary"
          },
          "clientId": {
            "$ref": "#/components/schemas/Id"
          },
          "title": {
            "$ref": "#/components/schemas/Name",
            "deprecated": true,
            "description": "Legacy input only. Its text is merged into summary; new clients should send summary alone."
          },
          "labelIds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Id"
            },
            "uniqueItems": true,
            "maxItems": 1000,
            "description": "Optional owner-owned labels. Omission preserves labels on edits; an empty array clears them. Older work sessions without this field have no labels."
          },
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ],
            "description": "Optional owner-owned project. Its client determines the session client. Omission preserves the project on edits; null clears it. Older sessions without this field have no project."
          }
        },
        "required": [
          "start",
          "end",
          "summary"
        ],
        "description": "Work sessions have a single optional description, summary. Legacy title inputs are merged into summary. Omitting clientId uses General on creation and preserves the current client on edits. Optional labels are preserved when omitted. An optional owned project determines the client; an explicitly supplied client must match. Omitting projectId preserves it on edits; null removes it."
      },
      "StartWorkSessionInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "summary": {
            "$ref": "#/components/schemas/WorkSessionSummary"
          },
          "clientId": {
            "$ref": "#/components/schemas/Id"
          },
          "title": {
            "$ref": "#/components/schemas/Name",
            "deprecated": true,
            "description": "Legacy input only. Its text is merged into summary; new clients should send summary alone."
          },
          "labelIds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Id"
            },
            "uniqueItems": true,
            "maxItems": 1000,
            "description": "Optional owner-owned labels. Omission preserves labels on edits; an empty array clears them. Older work sessions without this field have no labels."
          },
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ],
            "description": "Optional owner-owned project. Its client determines the session client. Omission preserves the project on edits; null clears it. Older sessions without this field have no project."
          }
        },
        "required": [
          "summary"
        ],
        "description": "Work sessions have a single optional description, summary. Legacy title inputs are merged into summary. Omitting clientId uses General on creation and preserves the current client on edits. Optional labels are preserved when omitted. An optional owned project determines the client; an explicitly supplied client must match. Omitting projectId preserves it on edits; null removes it."
      },
      "WorkSessionAssociationInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "workSessionId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ],
            "deprecated": true,
            "description": "Retired legacy field. Accepted for compatibility but ignored; work-session context is derived from time overlap."
          }
        },
        "required": [
          "workSessionId"
        ]
      },
      "WorkSessionAssociation": {
        "type": "object",
        "properties": {
          "activity": {
            "$ref": "#/components/schemas/Activity"
          },
          "outsideSession": {
            "type": "boolean"
          }
        },
        "required": [
          "activity",
          "outsideSession"
        ]
      },
      "WorkSessionTime": {
        "type": "object",
        "properties": {
          "duration": {
            "$ref": "#/components/schemas/Duration"
          },
          "trackedActivityTime": {
            "$ref": "#/components/schemas/Duration"
          },
          "allocatedTime": {
            "$ref": "#/components/schemas/Duration"
          },
          "unallocatedTime": {
            "$ref": "#/components/schemas/Duration"
          },
          "outsideSession": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Id"
            },
            "uniqueItems": true
          }
        },
        "required": [
          "duration",
          "trackedActivityTime",
          "allocatedTime",
          "unallocatedTime",
          "outsideSession"
        ]
      },
      "WorkSessionReport": {
        "type": "object",
        "properties": {
          "session": {
            "$ref": "#/components/schemas/WorkSession"
          },
          "activities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Activity"
            }
          },
          "time": {
            "$ref": "#/components/schemas/WorkSessionTime"
          },
          "generatedAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "session",
          "activities",
          "time",
          "generatedAt",
          "revision"
        ]
      },
      "WorkSessionPage": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WorkSession"
            }
          },
          "nextCursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "items",
          "nextCursor",
          "revision"
        ],
        "additionalProperties": true
      },
      "TransferWorkSession": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "start": {
            "$ref": "#/components/schemas/Instant"
          },
          "end": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "summary": {
            "$ref": "#/components/schemas/WorkSessionSummary"
          },
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "clientId": {
            "$ref": "#/components/schemas/Id"
          },
          "title": {
            "$ref": "#/components/schemas/Name",
            "deprecated": true,
            "description": "Legacy input only. Its text is merged into summary; new clients should send summary alone."
          },
          "labelIds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Id"
            },
            "uniqueItems": true,
            "maxItems": 1000,
            "description": "Optional owner-owned labels. Omission preserves labels on edits; an empty array clears them. Older work sessions without this field have no labels."
          },
          "projectId": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ],
            "description": "Optional owner-owned project. Its client determines the session client. Omission preserves the project on edits; null clears it. Older sessions without this field have no project."
          }
        },
        "required": [
          "id",
          "start",
          "end",
          "summary"
        ]
      },
      "ClientInput": {
        "type": "object",
        "properties": {
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "color": {
            "$ref": "#/components/schemas/Color"
          }
        },
        "required": [
          "name",
          "color"
        ],
        "additionalProperties": false
      },
      "Client": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "color": {
            "$ref": "#/components/schemas/Color"
          }
        },
        "required": [
          "id",
          "ownerId",
          "version",
          "name",
          "color"
        ],
        "additionalProperties": true
      },
      "ClientPage": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Client"
            }
          },
          "nextCursor": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "items",
          "nextCursor",
          "revision"
        ],
        "additionalProperties": true
      },
      "TransferClient": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "color": {
            "$ref": "#/components/schemas/Color"
          }
        },
        "required": [
          "id",
          "name",
          "color"
        ],
        "additionalProperties": false
      },
      "Account": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "ownerId",
          "username",
          "displayName",
          "state",
          "administrator",
          "version"
        ],
        "properties": {
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "username": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 64
          },
          "displayName": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "\\S"
          },
          "state": {
            "enum": [
              "UNCLAIMED",
              "ENABLED",
              "DISABLED"
            ]
          },
          "administrator": {
            "type": "boolean"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          }
        }
      },
      "AuthSession": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "ownerId",
          "username",
          "displayName",
          "state",
          "administrator",
          "version",
          "permissions"
        ],
        "properties": {
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "username": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 64
          },
          "displayName": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "\\S"
          },
          "state": {
            "enum": [
              "UNCLAIMED",
              "ENABLED",
              "DISABLED"
            ]
          },
          "administrator": {
            "type": "boolean"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "permissions": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "read",
                "write"
              ]
            },
            "minItems": 1,
            "maxItems": 2,
            "uniqueItems": true,
            "contains": {
              "const": "read"
            }
          },
          "csrf": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_-]{43}$"
          },
          "expiresAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "remember": {
            "type": "boolean"
          }
        }
      },
      "AuthStatus": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "setupRequired",
          "emailRecoveryEnabled",
          "passkeysEnabled"
        ],
        "properties": {
          "setupRequired": {
            "type": "boolean"
          },
          "spkVersion": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+-[1-9][0-9]*$",
            "description": "Installed Synology SPK version; null for other deployment types."
          },
          "emailRecoveryEnabled": {
            "type": "boolean"
          },
          "passkeysEnabled": {
            "type": "boolean",
            "description": "Whether the explicitly configured HTTPS origin supports passkey ceremonies."
          }
        }
      },
      "LoginInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "username",
          "password",
          "remember"
        ],
        "properties": {
          "username": {
            "type": "string",
            "maxLength": 200
          },
          "password": {
            "type": "string",
            "maxLength": 1024
          },
          "remember": {
            "type": "boolean"
          }
        }
      },
      "SetupInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "code",
          "username",
          "password",
          "displayName"
        ],
        "properties": {
          "code": {
            "type": "string",
            "maxLength": 100
          },
          "username": {
            "type": "string",
            "maxLength": 200
          },
          "password": {
            "type": "string",
            "maxLength": 1024,
            "minLength": 15,
            "description": "15 or more Unicode code points; at most 1024 UTF-8 bytes. Never trimmed."
          },
          "displayName": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "\\S"
          }
        }
      },
      "AccountInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "username",
          "displayName"
        ],
        "properties": {
          "username": {
            "type": "string",
            "maxLength": 200
          },
          "displayName": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "\\S"
          }
        }
      },
      "PasswordInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "currentPassword",
          "newPassword"
        ],
        "properties": {
          "currentPassword": {
            "type": "string",
            "maxLength": 1024
          },
          "newPassword": {
            "type": "string",
            "maxLength": 1024,
            "minLength": 15,
            "description": "15 or more Unicode code points; at most 1024 UTF-8 bytes. Never trimmed."
          }
        }
      },
      "TokenInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "permissions",
          "expiresAt"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "\\S"
          },
          "permissions": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "read",
                "write"
              ]
            },
            "minItems": 1,
            "maxItems": 2,
            "uniqueItems": true,
            "contains": {
              "const": "read"
            }
          },
          "expiresAt": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "TokenIssued": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "token"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "token": {
            "type": "string",
            "pattern": "^tkp_[A-Za-z0-9_-]{43}$"
          }
        }
      },
      "PersonalToken": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "name",
          "permissions",
          "expiresAt",
          "revoked",
          "source",
          "createdAt",
          "lastUsedAt",
          "version"
        ],
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "name": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "\\S"
          },
          "permissions": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "read",
                "write"
              ]
            },
            "minItems": 1,
            "maxItems": 2,
            "uniqueItems": true,
            "contains": {
              "const": "read"
            }
          },
          "expiresAt": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "revoked": {
            "type": "boolean"
          },
          "source": {
            "enum": [
              "LEGACY",
              "MANAGED"
            ]
          },
          "createdAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "lastUsedAt": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          }
        }
      },
      "TokenList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonalToken"
            }
          }
        }
      },
      "UserList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "users"
        ],
        "properties": {
          "users": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Account"
            }
          }
        }
      },
      "UserReply": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "user"
        ],
        "properties": {
          "user": {
            "$ref": "#/components/schemas/Account"
          }
        }
      },
      "UserCreateInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "username",
          "password",
          "displayName",
          "administrator",
          "email"
        ],
        "properties": {
          "username": {
            "type": "string",
            "maxLength": 200
          },
          "password": {
            "type": "string",
            "maxLength": 1024,
            "minLength": 15,
            "description": "15 or more Unicode code points; at most 1024 UTF-8 bytes. Never trimmed."
          },
          "displayName": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "\\S"
          },
          "administrator": {
            "type": "boolean"
          },
          "email": {
            "type": "string",
            "minLength": 3,
            "maxLength": 320
          }
        }
      },
      "UserInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "username",
          "displayName",
          "enabled",
          "administrator"
        ],
        "properties": {
          "username": {
            "type": "string",
            "maxLength": 200
          },
          "displayName": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "\\S"
          },
          "enabled": {
            "type": "boolean"
          },
          "administrator": {
            "type": "boolean"
          }
        }
      },
      "EmailForgotInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "username"
        ],
        "properties": {
          "username": {
            "type": "string",
            "maxLength": 200
          }
        }
      },
      "EmailTokenInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "token"
        ],
        "properties": {
          "token": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_-]{43}$"
          }
        }
      },
      "EmailLinkInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "token",
          "purpose"
        ],
        "properties": {
          "token": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_-]{43}$"
          },
          "purpose": {
            "type": "string",
            "enum": [
              "VERIFY",
              "RESET"
            ]
          }
        }
      },
      "EmailResetInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "token",
          "password"
        ],
        "properties": {
          "token": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_-]{43}$"
          },
          "password": {
            "type": "string",
            "maxLength": 1024,
            "minLength": 15,
            "description": "15 or more Unicode code points; at most 1024 UTF-8 bytes. Never trimmed."
          }
        }
      },
      "EmailResendInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [],
        "properties": {}
      },
      "RecoveryAddressInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "email",
          "currentPassword"
        ],
        "properties": {
          "email": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 320
          },
          "currentPassword": {
            "type": "string",
            "maxLength": 1024
          }
        }
      },
      "RecoveryAddress": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "slot",
          "verifiedAddress",
          "pendingAddress",
          "version"
        ],
        "properties": {
          "slot": {
            "type": "string",
            "enum": [
              "PRIMARY",
              "BACKUP"
            ]
          },
          "verifiedAddress": {
            "type": [
              "string",
              "null"
            ]
          },
          "pendingAddress": {
            "type": [
              "string",
              "null"
            ]
          },
          "version": {
            "type": "integer",
            "minimum": 0
          }
        }
      },
      "EmailForgotResult": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "message"
        ],
        "properties": {
          "message": {
            "type": "string"
          }
        }
      },
      "EmailSetupInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "code",
          "username",
          "password",
          "displayName",
          "email"
        ],
        "properties": {
          "code": {
            "type": "string",
            "maxLength": 100
          },
          "username": {
            "type": "string",
            "maxLength": 200
          },
          "password": {
            "type": "string",
            "maxLength": 1024,
            "minLength": 15,
            "description": "15 or more Unicode code points; at most 1024 UTF-8 bytes. Never trimmed."
          },
          "displayName": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "\\S"
          },
          "email": {
            "type": "string",
            "minLength": 3,
            "maxLength": 320
          }
        }
      },
      "ImportDigest": {
        "type": "string",
        "pattern": "^[0-9a-f]{64}$"
      },
      "ImportNanos": {
        "type": "string",
        "pattern": "^[0-9]{1,30}$",
        "description": "Exact nonnegative nanoseconds, represented as a decimal string."
      },
      "ImportReuseRecord": {
        "type": "object",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "etag": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "id",
          "etag"
        ],
        "additionalProperties": false
      },
      "ImportCatalogMapping": {
        "type": "object",
        "properties": {
          "key": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "resourceType": {
            "enum": [
              "CLIENT",
              "PROJECT",
              "TASK",
              "LABEL"
            ]
          },
          "action": {
            "enum": [
              "CREATE",
              "REUSE"
            ]
          },
          "name": {
            "type": "string",
            "maxLength": 1000
          },
          "color": {
            "$ref": "#/components/schemas/Color"
          },
          "parentKey": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "etag": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          }
        },
        "required": [
          "key",
          "resourceType",
          "action"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "action": {
                  "const": "CREATE"
                }
              }
            },
            "then": {
              "required": [
                "name"
              ]
            },
            "else": {
              "required": [
                "id",
                "etag"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "resourceType": {
                  "enum": [
                    "PROJECT",
                    "TASK"
                  ]
                }
              }
            },
            "then": {
              "required": [
                "parentKey"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "resourceType": {
                  "const": "CLIENT"
                },
                "action": {
                  "const": "CREATE"
                }
              }
            },
            "then": {
              "required": [
                "color"
              ]
            }
          }
        ]
      },
      "TogglImportRow": {
        "type": "object",
        "properties": {
          "sourceKey": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "sourceLine": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20971521
          },
          "sourceId": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "start": {
            "$ref": "#/components/schemas/Instant"
          },
          "end": {
            "$ref": "#/components/schemas/Instant"
          },
          "durationNanos": {
            "$ref": "#/components/schemas/ImportNanos"
          },
          "client": {
            "type": "string",
            "maxLength": 1000
          },
          "project": {
            "type": "string",
            "maxLength": 1000
          },
          "task": {
            "type": "string",
            "maxLength": 1000
          },
          "summary": {
            "$ref": "#/components/schemas/Summary"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 1000
            },
            "maxItems": 1000,
            "uniqueItems": true
          },
          "projectKey": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "taskKey": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ImportDigest"
              },
              {
                "type": "null"
              }
            ]
          },
          "labelKeys": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ImportDigest"
            },
            "maxItems": 1000,
            "uniqueItems": true
          },
          "occurrence": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100000
          },
          "duplicateReviewed": {
            "type": "boolean"
          },
          "duplicateDecision": {
            "enum": [
              "CREATE_DISTINCT",
              "REUSE"
            ]
          },
          "reuseActivities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ImportReuseRecord"
            },
            "maxItems": 1000
          },
          "clientKey": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1000,
            "deprecated": true,
            "description": "Historical source metadata used to resume older imports and retain duplicate identity; not stored as a work-session field."
          },
          "reuseWorkSessions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ImportReuseRecord"
            },
            "maxItems": 1
          }
        },
        "required": [
          "sourceKey",
          "start",
          "end",
          "durationNanos",
          "client",
          "project",
          "task",
          "summary",
          "tags",
          "occurrence"
        ],
        "additionalProperties": false,
        "anyOf": [
          {
            "required": [
              "clientKey"
            ]
          },
          {
            "required": [
              "projectKey",
              "labelKeys"
            ]
          }
        ]
      },
      "TogglImportRowsInput": {
        "type": "object",
        "properties": {
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TogglImportRow"
            },
            "maxItems": 100,
            "minItems": 1
          }
        },
        "required": [
          "rows"
        ],
        "additionalProperties": false
      },
      "TogglImportPreviewInput": {
        "type": "object",
        "properties": {
          "sourceKey": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "mappings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ImportCatalogMapping"
            },
            "maxItems": 1000
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TogglImportRow"
            },
            "maxItems": 100,
            "minItems": 1
          },
          "mode": {
            "type": "string",
            "enum": [
              "WORK_SESSION",
              "ACTIVITY"
            ],
            "default": "ACTIVITY",
            "description": "Web import defaults to WORK_SESSION. Omission retains legacy ACTIVITY behavior; the chosen mode is immutable for a job."
          }
        },
        "required": [
          "sourceKey",
          "mappings",
          "rows"
        ],
        "additionalProperties": false
      },
      "ImportSourceDiagnostics": {
        "type": "object",
        "description": "Client-reported CSV diagnostics. Counts reconcile all source rows with selected entries; no unselected source user identity or raw CSV is stored. Server committed counts remain authoritative.",
        "properties": {
          "sourceRows": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100000
          },
          "rejectedRows": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100000
          },
          "excludedRows": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100000
          },
          "unselectedRows": {
            "type": "integer",
            "minimum": 0,
            "maximum": 100000
          },
          "unsupportedFields": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 1000
            },
            "maxItems": 100,
            "uniqueItems": true
          }
        },
        "required": [
          "sourceRows",
          "rejectedRows",
          "excludedRows",
          "unselectedRows",
          "unsupportedFields"
        ],
        "additionalProperties": false
      },
      "TogglImportJobInput": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "sourceKey": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "selectionFingerprint": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "sourceDiagnostics": {
            "$ref": "#/components/schemas/ImportSourceDiagnostics"
          },
          "sourceDateFormat": {
            "type": "string",
            "enum": [
              "ISO",
              "DMY",
              "MDY"
            ],
            "default": "ISO"
          },
          "sourceZone": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "fileFingerprint": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "mappings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ImportCatalogMapping"
            },
            "maxItems": 1000
          },
          "selectedEntries": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100000
          },
          "selectedNanos": {
            "$ref": "#/components/schemas/ImportNanos"
          },
          "mode": {
            "type": "string",
            "enum": [
              "WORK_SESSION",
              "ACTIVITY"
            ],
            "default": "ACTIVITY",
            "description": "Web import defaults to WORK_SESSION. Omission retains legacy ACTIVITY behavior; the chosen mode is immutable for a job."
          }
        },
        "required": [
          "label",
          "sourceKey",
          "sourceZone",
          "fileFingerprint",
          "mappings",
          "selectedEntries",
          "selectedNanos"
        ],
        "additionalProperties": false
      },
      "TogglImportBatchInput": {
        "type": "object",
        "properties": {
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TogglImportRow"
            },
            "maxItems": 100,
            "minItems": 1
          },
          "reviewToken": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "finished": {
            "type": "boolean"
          }
        },
        "required": [
          "rows",
          "reviewToken",
          "finished"
        ],
        "additionalProperties": false
      },
      "ImportUndoBatchInput": {
        "type": "object",
        "properties": {
          "reviewToken": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "choices": {
            "type": "object",
            "maxProperties": 100,
            "propertyNames": {
              "pattern": "^[0-9]+:-?[0-9]+$"
            },
            "additionalProperties": {
              "enum": [
                "KEEP",
                "DELETE"
              ]
            }
          }
        },
        "required": [
          "reviewToken",
          "choices"
        ],
        "additionalProperties": false
      },
      "ImportJob": {
        "type": "object",
        "description": "Durable private import authority. GET is authoritative after any uncertain batch reply. Mapping plans are immutable; protected database backups retain jobs, receipts and lineage, while portable domain exports omit them.",
        "properties": {
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "label": {
            "type": "string",
            "maxLength": 255
          },
          "state": {
            "enum": [
              "IMPORTING",
              "IMPORTED",
              "UNDOING",
              "UNDONE",
              "UNDONE_PARTIAL",
              "BLOCKED"
            ]
          },
          "nextBatch": {
            "type": "integer",
            "minimum": 0
          },
          "undoNextBatch": {
            "type": "integer",
            "minimum": 0
          },
          "reportZone": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "sourceZone": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "mappings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ImportCatalogMapping"
            },
            "maxItems": 1000
          },
          "importedNanos": {
            "$ref": "#/components/schemas/ImportNanos"
          },
          "skippedNanos": {
            "$ref": "#/components/schemas/ImportNanos"
          },
          "selectedEntries": {
            "type": "integer",
            "minimum": 1
          },
          "selectedNanos": {
            "$ref": "#/components/schemas/ImportNanos"
          },
          "mode": {
            "type": "string",
            "enum": [
              "WORK_SESSION",
              "ACTIVITY"
            ],
            "default": "ACTIVITY",
            "description": "Web import defaults to WORK_SESSION. Omission retains legacy ACTIVITY behavior; the chosen mode is immutable for a job."
          }
        },
        "required": [
          "id",
          "ownerId",
          "version",
          "label",
          "state",
          "nextBatch",
          "undoNextBatch",
          "reportZone",
          "sourceZone"
        ],
        "additionalProperties": true
      },
      "ImportReview": {
        "type": "object",
        "description": "Bounded review with a token binding the exact request, current owned records and job version. Changed conditions produce 412. Duplicate decisions are explicit; source changes with a stable ID produce 409. No business data is written by preview.",
        "properties": {
          "reviewToken": {
            "$ref": "#/components/schemas/ImportDigest"
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "maxItems": 100
          },
          "targets": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "maxItems": 100
          }
        },
        "required": [
          "reviewToken"
        ],
        "additionalProperties": true
      },
      "ImportBatchResult": {
        "type": "object",
        "description": "Original durable batch outcome. Repeating the same job/index and content returns this result, including after restart; different content at that index produces 409. Historical results may predate Undo: reconcile with GET job.",
        "properties": {
          "jobId": {
            "$ref": "#/components/schemas/Id"
          },
          "batch": {
            "type": "integer",
            "minimum": 0
          },
          "jobVersion": {
            "$ref": "#/components/schemas/Version"
          },
          "state": {
            "type": "string"
          }
        },
        "required": [
          "jobId",
          "batch",
          "jobVersion",
          "state"
        ],
        "additionalProperties": true
      },
      "ImportHistoryPage": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ImportJob"
            },
            "maxItems": 100
          },
          "nextAfter": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "items",
          "nextAfter"
        ],
        "additionalProperties": false
      },
      "ImportItemPage": {
        "type": "object",
        "properties": {
          "jobId": {
            "$ref": "#/components/schemas/Id"
          },
          "items": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "maxItems": 100
          },
          "nextOffset": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0
          }
        },
        "required": [
          "jobId",
          "items",
          "nextOffset"
        ],
        "additionalProperties": false
      },
      "PasskeyProofInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [],
        "properties": {
          "currentPassword": {
            "type": "string",
            "maxLength": 1024
          },
          "proof": {
            "type": "string",
            "maxLength": 43,
            "pattern": "^[A-Za-z0-9_-]{43}$"
          }
        },
        "oneOf": [
          {
            "required": [
              "currentPassword"
            ]
          },
          {
            "required": [
              "proof"
            ]
          }
        ]
      },
      "PasskeyRegisterInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "currentPassword": {
            "type": "string",
            "maxLength": 1024
          },
          "proof": {
            "type": "string",
            "maxLength": 43,
            "pattern": "^[A-Za-z0-9_-]{43}$"
          },
          "name": {
            "$ref": "#/components/schemas/Name"
          }
        },
        "oneOf": [
          {
            "required": [
              "currentPassword"
            ]
          },
          {
            "required": [
              "proof"
            ]
          }
        ]
      },
      "PasskeyNameInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "$ref": "#/components/schemas/Name"
          }
        }
      },
      "PasskeyLoginInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "remember"
        ],
        "properties": {
          "remember": {
            "type": "boolean"
          }
        }
      },
      "PasskeyCancelInput": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "ceremony"
        ],
        "properties": {
          "ceremony": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_-]{43}$",
            "maxLength": 43
          }
        }
      },
      "PasskeyActionInput": {
        "oneOf": [
          {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "action"
            ],
            "properties": {
              "action": {
                "const": "ADD"
              }
            }
          },
          {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "action",
              "id",
              "etag"
            ],
            "properties": {
              "action": {
                "const": "REMOVE"
              },
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "etag": {
                "type": "string",
                "maxLength": 130
              }
            }
          }
        ]
      },
      "PasskeyRegistrationFinish": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "ceremony",
          "credential"
        ],
        "properties": {
          "ceremony": {
            "type": "string",
            "maxLength": 43,
            "pattern": "^[A-Za-z0-9_-]{43}$"
          },
          "credential": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "rawId",
              "type",
              "response",
              "clientExtensionResults"
            ],
            "properties": {
              "id": {
                "type": "string",
                "maxLength": 4096,
                "pattern": "^[A-Za-z0-9_-]+$",
                "minLength": 1
              },
              "rawId": {
                "type": "string",
                "maxLength": 4096,
                "pattern": "^[A-Za-z0-9_-]+$",
                "minLength": 1
              },
              "type": {
                "const": "public-key"
              },
              "response": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "clientDataJSON",
                  "attestationObject"
                ],
                "properties": {
                  "clientDataJSON": {
                    "type": "string",
                    "maxLength": 16384,
                    "pattern": "^[A-Za-z0-9_-]+$",
                    "minLength": 1
                  },
                  "attestationObject": {
                    "type": "string",
                    "maxLength": 65536,
                    "pattern": "^[A-Za-z0-9_-]+$",
                    "minLength": 1
                  },
                  "transports": {
                    "type": "array",
                    "maxItems": 16,
                    "uniqueItems": true,
                    "items": {
                      "type": "string",
                      "maxLength": 64
                    }
                  },
                  "authenticatorData": {
                    "type": "string",
                    "maxLength": 16384,
                    "pattern": "^[A-Za-z0-9_-]+$",
                    "minLength": 1
                  },
                  "publicKey": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 16384
                  },
                  "publicKeyAlgorithm": {
                    "type": "integer"
                  }
                }
              },
              "clientExtensionResults": {
                "type": "object",
                "maxProperties": 32
              },
              "authenticatorAttachment": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "platform",
                  "cross-platform",
                  null
                ]
              }
            }
          }
        }
      },
      "PasskeyAssertionFinish": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "ceremony",
          "credential"
        ],
        "properties": {
          "ceremony": {
            "type": "string",
            "maxLength": 43,
            "pattern": "^[A-Za-z0-9_-]{43}$"
          },
          "credential": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "id",
              "rawId",
              "type",
              "response",
              "clientExtensionResults"
            ],
            "properties": {
              "id": {
                "type": "string",
                "maxLength": 4096,
                "pattern": "^[A-Za-z0-9_-]+$",
                "minLength": 1
              },
              "rawId": {
                "type": "string",
                "maxLength": 4096,
                "pattern": "^[A-Za-z0-9_-]+$",
                "minLength": 1
              },
              "type": {
                "const": "public-key"
              },
              "response": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "clientDataJSON",
                  "authenticatorData",
                  "signature",
                  "userHandle"
                ],
                "properties": {
                  "clientDataJSON": {
                    "type": "string",
                    "maxLength": 16384,
                    "pattern": "^[A-Za-z0-9_-]+$",
                    "minLength": 1
                  },
                  "authenticatorData": {
                    "type": "string",
                    "maxLength": 16384,
                    "pattern": "^[A-Za-z0-9_-]+$",
                    "minLength": 1
                  },
                  "signature": {
                    "type": "string",
                    "maxLength": 4096,
                    "pattern": "^[A-Za-z0-9_-]+$",
                    "minLength": 1
                  },
                  "userHandle": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 128
                  }
                }
              },
              "clientExtensionResults": {
                "type": "object",
                "maxProperties": 32
              },
              "authenticatorAttachment": {
                "type": [
                  "string",
                  "null"
                ],
                "enum": [
                  "platform",
                  "cross-platform",
                  null
                ]
              }
            }
          }
        }
      },
      "PasskeyOptions": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "ceremony",
          "publicKey"
        ],
        "properties": {
          "ceremony": {
            "type": "string",
            "maxLength": 43,
            "pattern": "^[A-Za-z0-9_-]{43}$"
          },
          "publicKey": {
            "type": "object"
          }
        }
      },
      "PasskeyProofIssued": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "proof",
          "expiresAt"
        ],
        "properties": {
          "proof": {
            "type": "string",
            "maxLength": 43,
            "pattern": "^[A-Za-z0-9_-]{43}$"
          },
          "expiresAt": {
            "$ref": "#/components/schemas/Instant"
          }
        }
      },
      "PasskeyCredential": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "ownerId",
          "name",
          "rpId",
          "createdAt",
          "revoked",
          "version"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "ownerId": {
            "type": "string",
            "maxLength": 400,
            "minLength": 1
          },
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "rpId": {
            "type": "string",
            "maxLength": 255
          },
          "createdAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "revoked": {
            "type": "boolean"
          },
          "version": {
            "type": "integer",
            "minimum": 0
          }
        }
      },
      "PasskeyListedCredential": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "id",
          "ownerId",
          "name",
          "rpId",
          "createdAt",
          "revoked",
          "version",
          "etag",
          "lastUsedAt",
          "usableHere",
          "backedUp"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "ownerId": {
            "type": "string",
            "maxLength": 400,
            "minLength": 1
          },
          "name": {
            "$ref": "#/components/schemas/Name"
          },
          "rpId": {
            "type": "string",
            "maxLength": 255
          },
          "createdAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "revoked": {
            "type": "boolean"
          },
          "version": {
            "type": "integer",
            "minimum": 0
          },
          "etag": {
            "type": "string",
            "maxLength": 130
          },
          "lastUsedAt": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "usableHere": {
            "type": "boolean"
          },
          "backedUp": {
            "type": "boolean"
          }
        }
      },
      "PasskeyList": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "enabled",
          "rpId",
          "items"
        ],
        "properties": {
          "enabled": {
            "type": "boolean"
          },
          "rpId": {
            "type": "string",
            "maxLength": 255
          },
          "items": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "$ref": "#/components/schemas/PasskeyListedCredential"
            }
          }
        }
      },
      "PasskeyRemoved": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "signedOut"
        ],
        "properties": {
          "signedOut": {
            "type": "boolean"
          }
        }
      },
      "AdministrationSettings": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "configurationManagedBy",
          "databaseType",
          "schemaVersion",
          "publicOrigin",
          "originEpoch",
          "passkeysEnabled",
          "passkeyRpId",
          "emailRecoveryEnabled",
          "version",
          "effectiveVersion",
          "restartRequired",
          "smtpPasswordConfigured",
          "effectiveSmtpPasswordConfigured",
          "saved",
          "effective",
          "canEdit"
        ],
        "properties": {
          "configurationManagedBy": {
            "type": "string",
            "const": "administration"
          },
          "databaseType": {
            "type": "string",
            "enum": [
              "h2",
              "postgresql"
            ]
          },
          "schemaVersion": {
            "type": "integer",
            "minimum": 1
          },
          "publicOrigin": {
            "type": [
              "string",
              "null"
            ]
          },
          "originEpoch": {
            "type": "integer",
            "minimum": 0
          },
          "passkeysEnabled": {
            "type": "boolean"
          },
          "passkeyRpId": {
            "type": [
              "string",
              "null"
            ]
          },
          "emailRecoveryEnabled": {
            "type": "boolean"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "effectiveVersion": {
            "$ref": "#/components/schemas/Version"
          },
          "restartRequired": {
            "type": "boolean"
          },
          "smtpPasswordConfigured": {
            "type": "boolean"
          },
          "effectiveSmtpPasswordConfigured": {
            "type": "boolean"
          },
          "saved": {
            "$ref": "#/components/schemas/ServiceConfiguration"
          },
          "effective": {
            "$ref": "#/components/schemas/ServiceConfiguration"
          },
          "canEdit": {
            "type": "boolean",
            "description": "True only for an actual administrator account session, not a token-derived session."
          }
        }
      },
      "ServiceConfiguration": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "publicOrigin": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 2048
          },
          "passkeysEnabled": {
            "type": "boolean"
          },
          "passkeyRpId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "emailRecoveryEnabled": {
            "type": "boolean"
          },
          "smtpHost": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "smtpPort": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          },
          "smtpFrom": {
            "type": "string",
            "minLength": 1,
            "maxLength": 320
          },
          "smtpUsername": {
            "type": "string",
            "maxLength": 255
          },
          "smtpTls": {
            "type": "boolean"
          },
          "smtpStartTls": {
            "type": "string",
            "enum": [
              "DISABLED",
              "OPTIONAL",
              "REQUIRED"
            ]
          },
          "originEpoch": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "publicOrigin",
          "passkeysEnabled",
          "passkeyRpId",
          "emailRecoveryEnabled",
          "smtpHost",
          "smtpPort",
          "smtpFrom",
          "smtpUsername",
          "smtpTls",
          "smtpStartTls",
          "originEpoch"
        ]
      },
      "AdministrationSettingsInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "publicOrigin": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 2048
          },
          "passkeysEnabled": {
            "type": "boolean"
          },
          "passkeyRpId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "emailRecoveryEnabled": {
            "type": "boolean"
          },
          "smtpHost": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "smtpPort": {
            "type": "integer",
            "minimum": 1,
            "maximum": 65535
          },
          "smtpFrom": {
            "type": "string",
            "minLength": 1,
            "maxLength": 320
          },
          "smtpUsername": {
            "type": "string",
            "maxLength": 255
          },
          "smtpTls": {
            "type": "boolean"
          },
          "smtpStartTls": {
            "type": "string",
            "enum": [
              "DISABLED",
              "OPTIONAL",
              "REQUIRED"
            ]
          },
          "currentPassword": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1024
          },
          "smtpPasswordAction": {
            "enum": [
              "PRESERVE",
              "REPLACE",
              "CLEAR"
            ]
          },
          "smtpPassword": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 1024
          }
        },
        "required": [
          "publicOrigin",
          "passkeysEnabled",
          "passkeyRpId",
          "emailRecoveryEnabled",
          "smtpHost",
          "smtpPort",
          "smtpFrom",
          "smtpUsername",
          "smtpTls",
          "smtpStartTls",
          "currentPassword",
          "smtpPasswordAction"
        ],
        "description": "Administrator account session and current password required. Save desired settings using If-Match; coordinated restart activates them centrally and revokes retired authentication state. SMTP password is write-only: preserve, replace or clear explicitly."
      },
      "ArchivePreferences": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "zoneId": {
            "$ref": "#/components/schemas/ZoneId"
          }
        },
        "required": [
          "zoneId"
        ]
      },
      "ArchiveAccountMetadata": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "ownerId",
          "username",
          "displayName",
          "state",
          "administrator",
          "version",
          "recoveryAddresses",
          "apiTokenMetadata",
          "passkeyMetadata"
        ],
        "properties": {
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "username": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 64
          },
          "displayName": {
            "type": "string",
            "maxLength": 200,
            "minLength": 1,
            "pattern": "\\S"
          },
          "state": {
            "enum": [
              "UNCLAIMED",
              "ENABLED",
              "DISABLED"
            ]
          },
          "administrator": {
            "type": "boolean"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "recoveryAddresses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArchiveRecoveryAddress"
            },
            "maxItems": 2
          },
          "apiTokenMetadata": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArchiveTokenMetadata"
            },
            "maxItems": 250000
          },
          "passkeyMetadata": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArchivePasskeyMetadata"
            },
            "maxItems": 250000
          }
        }
      },
      "ArchiveRecoveryAddress": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "slot": {
            "enum": [
              "PRIMARY",
              "BACKUP"
            ]
          },
          "verifiedAddress": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 320
              },
              {
                "type": "null"
              }
            ]
          },
          "pendingAddress": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 320
              },
              {
                "type": "null"
              }
            ]
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "slot",
          "verifiedAddress",
          "pendingAddress",
          "version"
        ]
      },
      "ArchiveTokenMetadata": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 400
          },
          "permissions": {
            "enum": [
              "READ",
              "READ_WRITE"
            ]
          },
          "expiresAt": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "revoked": {
            "type": "boolean"
          },
          "source": {
            "enum": [
              "LEGACY",
              "MANAGED"
            ]
          },
          "createdAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "lastUsedAt": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "name",
          "permissions",
          "expiresAt",
          "revoked",
          "source",
          "createdAt",
          "lastUsedAt"
        ]
      },
      "ArchivePasskeyMetadata": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 400
          },
          "rpId": {
            "type": "string",
            "maxLength": 255
          },
          "createdAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "lastUsedAt": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Instant"
              },
              {
                "type": "null"
              }
            ]
          },
          "revoked": {
            "type": "boolean"
          }
        },
        "required": [
          "name",
          "rpId",
          "createdAt",
          "lastUsedAt",
          "revoked"
        ]
      },
      "ArchiveWorkSnapshot": {
        "type": "object",
        "properties": {
          "format": {
            "const": "timekeeper-domain-v3"
          },
          "zoneId": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "projects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferProject"
            },
            "maxItems": 250000
          },
          "tasks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferTask"
            },
            "maxItems": 250000
          },
          "labels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferLabel"
            },
            "maxItems": 250000
          },
          "activities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferActivity"
            },
            "maxItems": 250000
          },
          "workSessions": {
            "type": "array",
            "maxItems": 250000,
            "items": {
              "$ref": "#/components/schemas/TransferWorkSession"
            }
          },
          "clients": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TransferClient"
            },
            "maxItems": 250000
          }
        },
        "required": [
          "format",
          "zoneId",
          "projects",
          "tasks",
          "labels",
          "activities"
        ],
        "additionalProperties": false,
        "allOf": [
          {
            "if": {
              "properties": {
                "format": {
                  "const": "timekeeper-domain-v2"
                }
              }
            },
            "then": {
              "required": [
                "workSessions"
              ]
            }
          },
          {
            "if": {
              "properties": {
                "format": {
                  "const": "timekeeper-domain-v1"
                }
              }
            },
            "then": {
              "properties": {
                "workSessions": {
                  "maxItems": 0
                },
                "activities": {
                  "items": {
                    "properties": {
                      "taskId": {
                        "$ref": "#/components/schemas/Id"
                      },
                      "workSessionId": {
                        "type": "null"
                      },
                      "projectId": {
                        "type": "null"
                      }
                    }
                  }
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "format": {
                  "const": "timekeeper-domain-v3"
                }
              }
            },
            "then": {
              "required": [
                "clients",
                "workSessions"
              ],
              "properties": {
                "projects": {
                  "items": {
                    "required": [
                      "clientId"
                    ]
                  }
                },
                "workSessions": {
                  "items": {
                    "required": [
                      "clientId"
                    ]
                  }
                }
              }
            }
          },
          {
            "if": {
              "properties": {
                "format": {
                  "enum": [
                    "timekeeper-domain-v1",
                    "timekeeper-domain-v2"
                  ]
                }
              }
            },
            "then": {
              "properties": {
                "clients": {
                  "maxItems": 0
                },
                "projects": {
                  "items": {
                    "not": {
                      "required": [
                        "clientId"
                      ]
                    }
                  }
                },
                "workSessions": {
                  "items": {
                    "not": {
                      "anyOf": [
                        {
                          "required": [
                            "clientId"
                          ]
                        },
                        {
                          "required": [
                            "title"
                          ]
                        },
                        {
                          "required": [
                            "projectId"
                          ]
                        }
                      ]
                    }
                  }
                }
              }
            }
          }
        ]
      },
      "ArchiveAuditRecord": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "entityType": {
            "enum": [
              "IMPORT_JOB",
              "IMPORT_BATCH",
              "IMPORT_ITEM",
              "IMPORT_MAP",
              "IMPORT_KEY",
              "IMPORT_ORIGIN",
              "IMPORT_UNDO",
              "IMPORT_USE",
              "ARCHIVE_AUDIT",
              "ARCHIVE_IMPORT"
            ]
          },
          "data": {
            "type": "object",
            "description": "Inert source audit copy. Never restored as import, replay, credential or Undo authority."
          }
        },
        "required": [
          "entityType",
          "data"
        ]
      },
      "AccountArchiveSnapshot": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "format": {
            "const": "timekeeper-account-v1"
          },
          "archiveId": {
            "$ref": "#/components/schemas/Id"
          },
          "generatedAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "account": {
            "$ref": "#/components/schemas/ArchiveAccountMetadata"
          },
          "preferences": {
            "$ref": "#/components/schemas/ArchivePreferences"
          },
          "work": {
            "$ref": "#/components/schemas/ArchiveWorkSnapshot"
          },
          "importHistory": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ArchiveAuditRecord"
            },
            "maxItems": 1000000
          }
        },
        "required": [
          "format",
          "archiveId",
          "generatedAt",
          "account",
          "preferences",
          "work",
          "importHistory"
        ]
      },
      "AccountArchiveUploadInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "fileName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "mediaType": {
            "enum": [
              "application/zip",
              "application/json"
            ]
          },
          "bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 268435456
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "fileName",
          "mediaType",
          "bytes",
          "sha256"
        ]
      },
      "AccountArchiveChunkInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "data": {
            "type": "string",
            "minLength": 4,
            "maxLength": 1398104,
            "description": "Canonical padded base64 of the exact next chunk; up to 1 MiB of binary data."
          }
        },
        "required": [
          "data"
        ]
      },
      "AccountArchiveReviewInput": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "restoreTimeZone": {
            "type": "boolean"
          }
        },
        "required": [
          "restoreTimeZone"
        ]
      },
      "AccountArchiveCounts": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "clients": {
            "type": "integer",
            "minimum": 0
          },
          "projects": {
            "type": "integer",
            "minimum": 0
          },
          "tasks": {
            "type": "integer",
            "minimum": 0
          },
          "labels": {
            "type": "integer",
            "minimum": 0
          },
          "activities": {
            "type": "integer",
            "minimum": 0
          },
          "workSessions": {
            "type": "integer",
            "minimum": 0
          },
          "importAuditRecords": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "clients",
          "projects",
          "tasks",
          "labels",
          "activities",
          "workSessions",
          "importAuditRecords"
        ]
      },
      "AccountArchiveRestoreResult": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "importId": {
            "$ref": "#/components/schemas/Id"
          },
          "archiveId": {
            "$ref": "#/components/schemas/Id"
          },
          "importedAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "alreadyImported": {
            "type": "boolean"
          },
          "restoreTimeZone": {
            "type": "boolean"
          },
          "timeZone": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          },
          "counts": {
            "$ref": "#/components/schemas/AccountArchiveCounts"
          }
        },
        "required": [
          "importId",
          "archiveId",
          "importedAt",
          "alreadyImported",
          "restoreTimeZone",
          "timeZone",
          "revision",
          "counts"
        ]
      },
      "AccountArchiveReview": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "archiveId": {
            "$ref": "#/components/schemas/Id"
          },
          "generatedAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "counts": {
            "$ref": "#/components/schemas/AccountArchiveCounts"
          },
          "sourceAccount": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "username": {
                "anyOf": [
                  {
                    "type": "string",
                    "maxLength": 64
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "displayName": {
                "type": "string",
                "maxLength": 400
              }
            },
            "required": [
              "username",
              "displayName"
            ]
          },
          "sourceTimeZone": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "currentTimeZone": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "restoreTimeZone": {
            "type": "boolean"
          },
          "alreadyImported": {
            "const": false
          },
          "runningActivities": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          },
          "runningWorkSessions": {
            "type": "integer",
            "minimum": 0,
            "maximum": 1
          },
          "conflicts": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 10
          },
          "canImport": {
            "type": "boolean"
          },
          "relationships": {
            "$ref": "#/components/schemas/AccountArchiveRelationshipCounts",
            "description": "Present on new reviews; older retained review summaries may omit this field."
          }
        },
        "required": [
          "archiveId",
          "generatedAt",
          "counts",
          "sourceAccount",
          "sourceTimeZone",
          "currentTimeZone",
          "restoreTimeZone",
          "alreadyImported",
          "runningActivities",
          "runningWorkSessions",
          "conflicts",
          "canImport"
        ]
      },
      "AccountArchiveCompletedReview": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "importId": {
            "$ref": "#/components/schemas/Id"
          },
          "archiveId": {
            "$ref": "#/components/schemas/Id"
          },
          "importedAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "alreadyImported": {
            "const": true
          },
          "restoreTimeZone": {
            "type": "boolean"
          },
          "timeZone": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          },
          "counts": {
            "$ref": "#/components/schemas/AccountArchiveCounts"
          },
          "canImport": {
            "const": false
          }
        },
        "required": [
          "importId",
          "archiveId",
          "importedAt",
          "alreadyImported",
          "restoreTimeZone",
          "timeZone",
          "revision",
          "counts",
          "canImport"
        ]
      },
      "AccountArchivePreview": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/AccountArchiveReview"
          },
          {
            "$ref": "#/components/schemas/AccountArchiveCompletedReview"
          }
        ]
      },
      "AccountArchiveUpload": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "fileName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "mediaType": {
            "enum": [
              "application/zip",
              "application/json"
            ]
          },
          "bytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 268435456
          },
          "sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          },
          "chunkBytes": {
            "const": 1048576
          },
          "chunkCount": {
            "type": "integer",
            "minimum": 1,
            "maximum": 256
          },
          "nextChunk": {
            "type": "integer",
            "minimum": 0,
            "maximum": 256
          },
          "state": {
            "enum": [
              "UPLOADING",
              "READY",
              "REVIEWED",
              "IMPORTED"
            ]
          },
          "createdAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "expiresAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "review": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "revision": {
                "$ref": "#/components/schemas/Version"
              },
              "profileVersion": {
                "$ref": "#/components/schemas/Version"
              },
              "restoreTimeZone": {
                "type": "boolean"
              },
              "summary": {
                "$ref": "#/components/schemas/AccountArchiveReview"
              }
            },
            "required": [
              "revision",
              "profileVersion",
              "restoreTimeZone",
              "summary"
            ]
          },
          "outcome": {
            "$ref": "#/components/schemas/AccountArchiveRestoreResult"
          },
          "verifiedArchiveId": {
            "$ref": "#/components/schemas/Id"
          },
          "verifiedArchiveDigest": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          }
        },
        "required": [
          "fileName",
          "mediaType",
          "bytes",
          "sha256",
          "id",
          "ownerId",
          "version",
          "chunkBytes",
          "chunkCount",
          "nextChunk",
          "state",
          "createdAt",
          "expiresAt"
        ]
      },
      "AccountArchiveImportRecord": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "importId": {
            "$ref": "#/components/schemas/Id"
          },
          "archiveId": {
            "$ref": "#/components/schemas/Id"
          },
          "importedAt": {
            "$ref": "#/components/schemas/Instant"
          },
          "alreadyImported": {
            "type": "boolean"
          },
          "restoreTimeZone": {
            "type": "boolean"
          },
          "timeZone": {
            "$ref": "#/components/schemas/ZoneId"
          },
          "revision": {
            "$ref": "#/components/schemas/Version"
          },
          "counts": {
            "$ref": "#/components/schemas/AccountArchiveCounts"
          },
          "id": {
            "$ref": "#/components/schemas/Id"
          },
          "ownerId": {
            "$ref": "#/components/schemas/OwnerId"
          },
          "version": {
            "$ref": "#/components/schemas/Version"
          }
        },
        "required": [
          "importId",
          "archiveId",
          "importedAt",
          "alreadyImported",
          "restoreTimeZone",
          "timeZone",
          "revision",
          "counts",
          "id",
          "ownerId",
          "version"
        ]
      },
      "AccountArchiveHistory": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AccountArchiveImportRecord"
            },
            "maxItems": 100
          },
          "nextAfter": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/Id"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "items",
          "nextAfter"
        ]
      },
      "AccountArchivePendingUploads": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "items"
        ],
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AccountArchiveUpload"
            },
            "maxItems": 3
          }
        }
      },
      "AccountArchiveRelationshipCounts": {
        "type": "object",
        "additionalProperties": false,
        "description": "Counts of validated source references preserved under new record IDs.",
        "properties": {
          "projectClients": {
            "type": "integer",
            "minimum": 0
          },
          "taskProjects": {
            "type": "integer",
            "minimum": 0
          },
          "parentTasks": {
            "type": "integer",
            "minimum": 0
          },
          "activityTasks": {
            "type": "integer",
            "minimum": 0
          },
          "activityProjects": {
            "type": "integer",
            "minimum": 0
          },
          "activityLabels": {
            "type": "integer",
            "minimum": 0
          },
          "workSessionClients": {
            "type": "integer",
            "minimum": 0
          },
          "workSessionProjects": {
            "type": "integer",
            "minimum": 0
          },
          "workSessionLabels": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "projectClients",
          "taskProjects",
          "parentTasks",
          "activityTasks",
          "activityProjects",
          "activityLabels",
          "workSessionClients",
          "workSessionProjects",
          "workSessionLabels"
        ]
      },
      "WorkSessionSummary": {
        "type": "string",
        "maxLength": 4000,
        "description": "The optional work-session description. Empty summaries are allowed. Existing titles are folded into this field without losing notes."
      },
      "ProjectIcon": {
        "anyOf": [
          {
            "type": "string",
            "enum": [
              "briefcase",
              "code",
              "globe",
              "building",
              "tools",
              "flask",
              "book",
              "palette",
              "chart",
              "folder",
              "mobile",
              "cloud",
              "0",
              "1",
              "2",
              "3",
              "4",
              "5",
              "6",
              "7",
              "8",
              "9",
              "a",
              "address-book",
              "address-card",
              "alarm-clock",
              "align-center",
              "align-justify",
              "align-left",
              "align-right",
              "anchor",
              "anchor-circle-check",
              "anchor-circle-exclamation",
              "anchor-circle-xmark",
              "anchor-lock",
              "angle-down",
              "angle-left",
              "angle-right",
              "angle-up",
              "angles-down",
              "angles-left",
              "angles-right",
              "angles-up",
              "ankh",
              "apple-whole",
              "aquarius",
              "archway",
              "aries",
              "arrow-down",
              "arrow-down-1-9",
              "arrow-down-9-1",
              "arrow-down-a-z",
              "arrow-down-long",
              "arrow-down-short-wide",
              "arrow-down-up-across-line",
              "arrow-down-up-lock",
              "arrow-down-wide-short",
              "arrow-down-z-a",
              "arrow-left",
              "arrow-left-long",
              "arrow-pointer",
              "arrow-right",
              "arrow-right-arrow-left",
              "arrow-right-from-bracket",
              "arrow-right-long",
              "arrow-right-to-bracket",
              "arrow-right-to-city",
              "arrow-rotate-left",
              "arrow-rotate-right",
              "arrow-trend-down",
              "arrow-trend-up",
              "arrow-turn-down",
              "arrow-turn-up",
              "arrow-up",
              "arrow-up-1-9",
              "arrow-up-9-1",
              "arrow-up-a-z",
              "arrow-up-from-bracket",
              "arrow-up-from-ground-water",
              "arrow-up-from-water-pump",
              "arrow-up-long",
              "arrow-up-right-dots",
              "arrow-up-right-from-square",
              "arrow-up-short-wide",
              "arrow-up-wide-short",
              "arrow-up-z-a",
              "arrows-down-to-line",
              "arrows-down-to-people",
              "arrows-left-right",
              "arrows-left-right-to-line",
              "arrows-rotate",
              "arrows-spin",
              "arrows-split-up-and-left",
              "arrows-to-circle",
              "arrows-to-dot",
              "arrows-to-eye",
              "arrows-turn-right",
              "arrows-turn-to-dots",
              "arrows-up-down",
              "arrows-up-down-left-right",
              "arrows-up-to-line",
              "asterisk",
              "at",
              "atom",
              "audio-description",
              "austral-sign",
              "award",
              "b",
              "baby",
              "baby-carriage",
              "backward",
              "backward-fast",
              "backward-step",
              "bacon",
              "bacteria",
              "bacterium",
              "bag-shopping",
              "bahai",
              "baht-sign",
              "ban",
              "ban-smoking",
              "bandage",
              "bangladeshi-taka-sign",
              "barcode",
              "bars",
              "bars-progress",
              "bars-staggered",
              "baseball",
              "baseball-bat-ball",
              "basket-shopping",
              "basketball",
              "bath",
              "battery-empty",
              "battery-full",
              "battery-half",
              "battery-quarter",
              "battery-three-quarters",
              "bed",
              "bed-pulse",
              "beer-mug-empty",
              "bell",
              "bell-concierge",
              "bell-slash",
              "bezier-curve",
              "bicycle",
              "binoculars",
              "biohazard",
              "bitcoin-sign",
              "blender",
              "blender-phone",
              "blog",
              "bold",
              "bolt",
              "bolt-lightning",
              "bomb",
              "bone",
              "bong",
              "book-atlas",
              "book-bible",
              "book-bookmark",
              "book-journal-whills",
              "book-medical",
              "book-open",
              "book-open-reader",
              "book-quran",
              "book-skull",
              "book-tanakh",
              "bookmark",
              "border-all",
              "border-none",
              "border-top-left",
              "bore-hole",
              "bottle-droplet",
              "bottle-water",
              "bowl-food",
              "bowl-rice",
              "bowling-ball",
              "box",
              "box-archive",
              "box-open",
              "box-tissue",
              "boxes-packing",
              "boxes-stacked",
              "braille",
              "brain",
              "brazilian-real-sign",
              "bread-slice",
              "bridge",
              "bridge-circle-check",
              "bridge-circle-exclamation",
              "bridge-circle-xmark",
              "bridge-lock",
              "bridge-water",
              "briefcase-medical",
              "broom",
              "broom-ball",
              "brush",
              "bucket",
              "bug",
              "bug-slash",
              "bugs",
              "building-circle-arrow-right",
              "building-circle-check",
              "building-circle-exclamation",
              "building-circle-xmark",
              "building-columns",
              "building-flag",
              "building-lock",
              "building-ngo",
              "building-shield",
              "building-un",
              "building-user",
              "building-wheat",
              "bullhorn",
              "bullseye",
              "burger",
              "burst",
              "bus",
              "bus-side",
              "bus-simple",
              "business-time",
              "c",
              "cable-car",
              "cake-candles",
              "calculator",
              "calendar",
              "calendar-check",
              "calendar-day",
              "calendar-days",
              "calendar-minus",
              "calendar-plus",
              "calendar-week",
              "calendar-xmark",
              "camera",
              "camera-retro",
              "camera-rotate",
              "campground",
              "cancer",
              "candy-cane",
              "cannabis",
              "capricorn",
              "capsules",
              "car",
              "car-battery",
              "car-burst",
              "car-on",
              "car-rear",
              "car-side",
              "car-tunnel",
              "caravan",
              "caret-down",
              "caret-left",
              "caret-right",
              "caret-up",
              "carrot",
              "cart-arrow-down",
              "cart-flatbed",
              "cart-flatbed-suitcase",
              "cart-plus",
              "cart-shopping",
              "cash-register",
              "cat",
              "cedi-sign",
              "cent-sign",
              "certificate",
              "chair",
              "chalkboard",
              "chalkboard-user",
              "champagne-glasses",
              "charging-station",
              "chart-area",
              "chart-bar",
              "chart-column",
              "chart-diagram",
              "chart-gantt",
              "chart-line",
              "chart-pie",
              "chart-simple",
              "check",
              "check-double",
              "check-to-slot",
              "cheese",
              "chess",
              "chess-bishop",
              "chess-board",
              "chess-king",
              "chess-knight",
              "chess-pawn",
              "chess-queen",
              "chess-rook",
              "chevron-down",
              "chevron-left",
              "chevron-right",
              "chevron-up",
              "child",
              "child-combatant",
              "child-dress",
              "child-reaching",
              "children",
              "church",
              "circle",
              "circle-arrow-down",
              "circle-arrow-left",
              "circle-arrow-right",
              "circle-arrow-up",
              "circle-check",
              "circle-chevron-down",
              "circle-chevron-left",
              "circle-chevron-right",
              "circle-chevron-up",
              "circle-dollar-to-slot",
              "circle-dot",
              "circle-down",
              "circle-exclamation",
              "circle-h",
              "circle-half-stroke",
              "circle-info",
              "circle-left",
              "circle-minus",
              "circle-nodes",
              "circle-notch",
              "circle-pause",
              "circle-play",
              "circle-plus",
              "circle-question",
              "circle-radiation",
              "circle-right",
              "circle-stop",
              "circle-up",
              "circle-user",
              "circle-xmark",
              "city",
              "clapperboard",
              "clipboard",
              "clipboard-check",
              "clipboard-list",
              "clipboard-question",
              "clipboard-user",
              "clock",
              "clock-rotate-left",
              "clone",
              "closed-captioning",
              "closed-captioning-slash",
              "cloud-arrow-down",
              "cloud-arrow-up",
              "cloud-bolt",
              "cloud-meatball",
              "cloud-moon",
              "cloud-moon-rain",
              "cloud-rain",
              "cloud-showers-heavy",
              "cloud-showers-water",
              "cloud-sun",
              "cloud-sun-rain",
              "clover",
              "code-branch",
              "code-commit",
              "code-compare",
              "code-fork",
              "code-merge",
              "code-pull-request",
              "coins",
              "colon-sign",
              "comment",
              "comment-dollar",
              "comment-dots",
              "comment-medical",
              "comment-nodes",
              "comment-slash",
              "comment-sms",
              "comments",
              "comments-dollar",
              "compact-disc",
              "compass",
              "compass-drafting",
              "compress",
              "computer",
              "computer-mouse",
              "cookie",
              "cookie-bite",
              "copy",
              "copyright",
              "couch",
              "cow",
              "credit-card",
              "crop",
              "crop-simple",
              "cross",
              "crosshairs",
              "crow",
              "crown",
              "crutch",
              "cruzeiro-sign",
              "cube",
              "cubes",
              "cubes-stacked",
              "d",
              "database",
              "delete-left",
              "democrat",
              "desktop",
              "dharmachakra",
              "diagram-next",
              "diagram-predecessor",
              "diagram-project",
              "diagram-successor",
              "diamond",
              "diamond-turn-right",
              "dice",
              "dice-d20",
              "dice-d6",
              "dice-five",
              "dice-four",
              "dice-one",
              "dice-six",
              "dice-three",
              "dice-two",
              "disease",
              "display",
              "divide",
              "dna",
              "dog",
              "dollar-sign",
              "dolly",
              "dong-sign",
              "door-closed",
              "door-open",
              "dove",
              "down-left-and-up-right-to-center",
              "down-long",
              "download",
              "dragon",
              "draw-polygon",
              "droplet",
              "droplet-slash",
              "drum",
              "drum-steelpan",
              "drumstick-bite",
              "dumbbell",
              "dumpster",
              "dumpster-fire",
              "dungeon",
              "e",
              "ear-deaf",
              "ear-listen",
              "earth-africa",
              "earth-americas",
              "earth-asia",
              "earth-europe",
              "earth-oceania",
              "egg",
              "eject",
              "elevator",
              "ellipsis",
              "ellipsis-vertical",
              "envelope",
              "envelope-circle-check",
              "envelope-open",
              "envelope-open-text",
              "envelopes-bulk",
              "equals",
              "eraser",
              "ethernet",
              "euro-sign",
              "exclamation",
              "expand",
              "explosion",
              "eye",
              "eye-dropper",
              "eye-low-vision",
              "eye-slash",
              "f",
              "face-angry",
              "face-dizzy",
              "face-flushed",
              "face-frown",
              "face-frown-open",
              "face-grimace",
              "face-grin",
              "face-grin-beam",
              "face-grin-beam-sweat",
              "face-grin-hearts",
              "face-grin-squint",
              "face-grin-squint-tears",
              "face-grin-stars",
              "face-grin-tears",
              "face-grin-tongue",
              "face-grin-tongue-squint",
              "face-grin-tongue-wink",
              "face-grin-wide",
              "face-grin-wink",
              "face-kiss",
              "face-kiss-beam",
              "face-kiss-wink-heart",
              "face-laugh",
              "face-laugh-beam",
              "face-laugh-squint",
              "face-laugh-wink",
              "face-meh",
              "face-meh-blank",
              "face-rolling-eyes",
              "face-sad-cry",
              "face-sad-tear",
              "face-smile",
              "face-smile-beam",
              "face-smile-wink",
              "face-surprise",
              "face-tired",
              "fan",
              "faucet",
              "faucet-drip",
              "fax",
              "feather",
              "feather-pointed",
              "ferry",
              "file",
              "file-arrow-down",
              "file-arrow-up",
              "file-audio",
              "file-circle-check",
              "file-circle-exclamation",
              "file-circle-minus",
              "file-circle-plus",
              "file-circle-question",
              "file-circle-xmark",
              "file-code",
              "file-contract",
              "file-csv",
              "file-excel",
              "file-export",
              "file-fragment",
              "file-half-dashed",
              "file-image",
              "file-import",
              "file-invoice",
              "file-invoice-dollar",
              "file-lines",
              "file-medical",
              "file-pdf",
              "file-pen",
              "file-powerpoint",
              "file-prescription",
              "file-shield",
              "file-signature",
              "file-video",
              "file-waveform",
              "file-word",
              "file-zipper",
              "fill",
              "fill-drip",
              "film",
              "filter",
              "filter-circle-dollar",
              "filter-circle-xmark",
              "fingerprint",
              "fire",
              "fire-burner",
              "fire-extinguisher",
              "fire-flame-curved",
              "fire-flame-simple",
              "fish",
              "fish-fins",
              "flag",
              "flag-checkered",
              "flag-usa",
              "flask-vial",
              "floppy-disk",
              "florin-sign",
              "folder-closed",
              "folder-minus",
              "folder-open",
              "folder-plus",
              "folder-tree",
              "font",
              "font-awesome",
              "football",
              "forward",
              "forward-fast",
              "forward-step",
              "franc-sign",
              "frog",
              "futbol",
              "g",
              "gamepad",
              "gas-pump",
              "gauge",
              "gauge-high",
              "gauge-simple",
              "gauge-simple-high",
              "gavel",
              "gear",
              "gears",
              "gem",
              "gemini",
              "genderless",
              "ghost",
              "gift",
              "gifts",
              "glass-water",
              "glass-water-droplet",
              "glasses",
              "golf-ball-tee",
              "gopuram",
              "graduation-cap",
              "greater-than",
              "greater-than-equal",
              "grip",
              "grip-lines",
              "grip-lines-vertical",
              "grip-vertical",
              "group-arrows-rotate",
              "guarani-sign",
              "guitar",
              "gun",
              "h",
              "hammer",
              "hamsa",
              "hand",
              "hand-back-fist",
              "hand-dots",
              "hand-fist",
              "hand-holding",
              "hand-holding-dollar",
              "hand-holding-droplet",
              "hand-holding-hand",
              "hand-holding-heart",
              "hand-holding-medical",
              "hand-lizard",
              "hand-middle-finger",
              "hand-peace",
              "hand-point-down",
              "hand-point-left",
              "hand-point-right",
              "hand-point-up",
              "hand-pointer",
              "hand-scissors",
              "hand-sparkles",
              "hand-spock",
              "handcuffs",
              "hands",
              "hands-asl-interpreting",
              "hands-bound",
              "hands-bubbles",
              "hands-clapping",
              "hands-holding",
              "hands-holding-child",
              "hands-holding-circle",
              "hands-praying",
              "handshake",
              "handshake-angle",
              "handshake-slash",
              "hanukiah",
              "hard-drive",
              "hashtag",
              "hat-cowboy",
              "hat-cowboy-side",
              "hat-wizard",
              "head-side-cough",
              "head-side-cough-slash",
              "head-side-mask",
              "head-side-virus",
              "heading",
              "headphones",
              "headset",
              "heart",
              "heart-circle-bolt",
              "heart-circle-check",
              "heart-circle-exclamation",
              "heart-circle-minus",
              "heart-circle-plus",
              "heart-circle-xmark",
              "heart-crack",
              "heart-pulse",
              "helicopter",
              "helicopter-symbol",
              "helmet-safety",
              "helmet-un",
              "hexagon",
              "hexagon-nodes",
              "hexagon-nodes-bolt",
              "highlighter",
              "hill-avalanche",
              "hill-rockslide",
              "hippo",
              "hockey-puck",
              "holly-berry",
              "horse",
              "horse-head",
              "hospital",
              "hospital-user",
              "hot-tub-person",
              "hotdog",
              "hotel",
              "hourglass",
              "hourglass-end",
              "hourglass-half",
              "hourglass-start",
              "house",
              "house-chimney",
              "house-chimney-crack",
              "house-chimney-medical",
              "house-chimney-user",
              "house-chimney-window",
              "house-circle-check",
              "house-circle-exclamation",
              "house-circle-xmark",
              "house-crack",
              "house-fire",
              "house-flag",
              "house-flood-water",
              "house-flood-water-circle-arrow-right",
              "house-laptop",
              "house-lock",
              "house-medical",
              "house-medical-circle-check",
              "house-medical-circle-exclamation",
              "house-medical-circle-xmark",
              "house-medical-flag",
              "house-signal",
              "house-tsunami",
              "house-user",
              "hryvnia-sign",
              "hurricane",
              "i",
              "i-cursor",
              "ice-cream",
              "icicles",
              "icons",
              "id-badge",
              "id-card",
              "id-card-clip",
              "igloo",
              "image",
              "image-portrait",
              "images",
              "inbox",
              "indent",
              "indian-rupee-sign",
              "industry",
              "infinity",
              "info",
              "italic",
              "j",
              "jar",
              "jar-wheat",
              "jedi",
              "jet-fighter",
              "jet-fighter-up",
              "joint",
              "jug-detergent",
              "k",
              "kaaba",
              "key",
              "keyboard",
              "khanda",
              "kip-sign",
              "kit-medical",
              "kitchen-set",
              "kiwi-bird",
              "l",
              "land-mine-on",
              "landmark",
              "landmark-dome",
              "landmark-flag",
              "language",
              "laptop",
              "laptop-code",
              "laptop-file",
              "laptop-medical",
              "lari-sign",
              "layer-group",
              "leaf",
              "left-long",
              "left-right",
              "lemon",
              "leo",
              "less-than",
              "less-than-equal",
              "libra",
              "life-ring",
              "lightbulb",
              "lines-leaning",
              "link",
              "link-slash",
              "lira-sign",
              "list",
              "list-check",
              "list-ol",
              "list-ul",
              "litecoin-sign",
              "location-arrow",
              "location-crosshairs",
              "location-dot",
              "location-pin",
              "location-pin-lock",
              "lock",
              "lock-open",
              "locust",
              "lungs",
              "lungs-virus",
              "m",
              "magnet",
              "magnifying-glass",
              "magnifying-glass-arrow-right",
              "magnifying-glass-chart",
              "magnifying-glass-dollar",
              "magnifying-glass-location",
              "magnifying-glass-minus",
              "magnifying-glass-plus",
              "manat-sign",
              "map",
              "map-location",
              "map-location-dot",
              "map-pin",
              "marker",
              "mars",
              "mars-and-venus",
              "mars-and-venus-burst",
              "mars-double",
              "mars-stroke",
              "mars-stroke-right",
              "mars-stroke-up",
              "martini-glass",
              "martini-glass-citrus",
              "martini-glass-empty",
              "mask",
              "mask-face",
              "mask-ventilator",
              "masks-theater",
              "mattress-pillow",
              "maximize",
              "medal",
              "memory",
              "menorah",
              "mercury",
              "message",
              "meteor",
              "microchip",
              "microphone",
              "microphone-lines",
              "microphone-lines-slash",
              "microphone-slash",
              "microscope",
              "mill-sign",
              "minimize",
              "minus",
              "mitten",
              "mobile-button",
              "mobile-retro",
              "mobile-screen",
              "mobile-screen-button",
              "mobile-vibrate",
              "money-bill",
              "money-bill-1",
              "money-bill-1-wave",
              "money-bill-transfer",
              "money-bill-trend-up",
              "money-bill-wave",
              "money-bill-wheat",
              "money-bills",
              "money-check",
              "money-check-dollar",
              "monument",
              "moon",
              "mortar-pestle",
              "mosque",
              "mosquito",
              "mosquito-net",
              "motorcycle",
              "mound",
              "mountain",
              "mountain-city",
              "mountain-sun",
              "mug-hot",
              "mug-saucer",
              "music",
              "n",
              "naira-sign",
              "network-wired",
              "neuter",
              "newspaper",
              "non-binary",
              "not-equal",
              "notdef",
              "note-sticky",
              "notes-medical",
              "o",
              "object-group",
              "object-ungroup",
              "octagon",
              "oil-can",
              "oil-well",
              "om",
              "otter",
              "outdent",
              "p",
              "pager",
              "paint-roller",
              "paintbrush",
              "pallet",
              "panorama",
              "paper-plane",
              "paperclip",
              "parachute-box",
              "paragraph",
              "passport",
              "paste",
              "pause",
              "paw",
              "peace",
              "pen",
              "pen-clip",
              "pen-fancy",
              "pen-nib",
              "pen-ruler",
              "pen-to-square",
              "pencil",
              "pentagon",
              "people-arrows",
              "people-carry-box",
              "people-group",
              "people-line",
              "people-pulling",
              "people-robbery",
              "people-roof",
              "pepper-hot",
              "percent",
              "person",
              "person-arrow-down-to-line",
              "person-arrow-up-from-line",
              "person-biking",
              "person-booth",
              "person-breastfeeding",
              "person-burst",
              "person-cane",
              "person-chalkboard",
              "person-circle-check",
              "person-circle-exclamation",
              "person-circle-minus",
              "person-circle-plus",
              "person-circle-question",
              "person-circle-xmark",
              "person-digging",
              "person-dots-from-line",
              "person-dress",
              "person-dress-burst",
              "person-drowning",
              "person-falling",
              "person-falling-burst",
              "person-half-dress",
              "person-harassing",
              "person-hiking",
              "person-military-pointing",
              "person-military-rifle",
              "person-military-to-person",
              "person-praying",
              "person-pregnant",
              "person-rays",
              "person-rifle",
              "person-running",
              "person-shelter",
              "person-skating",
              "person-skiing",
              "person-skiing-nordic",
              "person-snowboarding",
              "person-swimming",
              "person-through-window",
              "person-walking",
              "person-walking-arrow-loop-left",
              "person-walking-arrow-right",
              "person-walking-dashed-line-arrow-right",
              "person-walking-luggage",
              "person-walking-with-cane",
              "peseta-sign",
              "peso-sign",
              "phone",
              "phone-flip",
              "phone-slash",
              "phone-volume",
              "photo-film",
              "picture-in-picture",
              "piggy-bank",
              "pills",
              "pisces",
              "pizza-slice",
              "place-of-worship",
              "plane",
              "plane-arrival",
              "plane-circle-check",
              "plane-circle-exclamation",
              "plane-circle-xmark",
              "plane-departure",
              "plane-lock",
              "plane-slash",
              "plane-up",
              "plant-wilt",
              "plate-wheat",
              "play",
              "plug",
              "plug-circle-bolt",
              "plug-circle-check",
              "plug-circle-exclamation",
              "plug-circle-minus",
              "plug-circle-plus",
              "plug-circle-xmark",
              "plus",
              "plus-minus",
              "podcast",
              "poo",
              "poo-storm",
              "poop",
              "power-off",
              "prescription",
              "prescription-bottle",
              "prescription-bottle-medical",
              "print",
              "pump-medical",
              "pump-soap",
              "puzzle-piece",
              "q",
              "qrcode",
              "question",
              "quote-left",
              "quote-right",
              "r",
              "radiation",
              "radio",
              "rainbow",
              "ranking-star",
              "receipt",
              "record-vinyl",
              "rectangle-ad",
              "rectangle-list",
              "rectangle-xmark",
              "recycle",
              "registered",
              "repeat",
              "reply",
              "reply-all",
              "republican",
              "restroom",
              "retweet",
              "ribbon",
              "right-from-bracket",
              "right-left",
              "right-long",
              "right-to-bracket",
              "ring",
              "road",
              "road-barrier",
              "road-bridge",
              "road-circle-check",
              "road-circle-exclamation",
              "road-circle-xmark",
              "road-lock",
              "road-spikes",
              "robot",
              "rocket",
              "rotate",
              "rotate-left",
              "rotate-right",
              "route",
              "rss",
              "ruble-sign",
              "rug",
              "ruler",
              "ruler-combined",
              "ruler-horizontal",
              "ruler-vertical",
              "rupee-sign",
              "rupiah-sign",
              "s",
              "sack-dollar",
              "sack-xmark",
              "sagittarius",
              "sailboat",
              "satellite",
              "satellite-dish",
              "scale-balanced",
              "scale-unbalanced",
              "scale-unbalanced-flip",
              "school",
              "school-circle-check",
              "school-circle-exclamation",
              "school-circle-xmark",
              "school-flag",
              "school-lock",
              "scissors",
              "scorpio",
              "screwdriver",
              "screwdriver-wrench",
              "scroll",
              "scroll-torah",
              "sd-card",
              "section",
              "seedling",
              "septagon",
              "server",
              "shapes",
              "share",
              "share-from-square",
              "share-nodes",
              "sheet-plastic",
              "shekel-sign",
              "shield",
              "shield-cat",
              "shield-dog",
              "shield-halved",
              "shield-heart",
              "shield-virus",
              "ship",
              "shirt",
              "shoe-prints",
              "shop",
              "shop-lock",
              "shop-slash",
              "shower",
              "shrimp",
              "shuffle",
              "shuttle-space",
              "sign-hanging",
              "signal",
              "signature",
              "signs-post",
              "sim-card",
              "single-quote-left",
              "single-quote-right",
              "sink",
              "sitemap",
              "skull",
              "skull-crossbones",
              "slash",
              "sleigh",
              "sliders",
              "smog",
              "smoking",
              "snowflake",
              "snowman",
              "snowplow",
              "soap",
              "socks",
              "solar-panel",
              "sort",
              "sort-down",
              "sort-up",
              "spa",
              "spaghetti-monster-flying",
              "spell-check",
              "spider",
              "spinner",
              "spiral",
              "splotch",
              "spoon",
              "spray-can",
              "spray-can-sparkles",
              "square",
              "square-arrow-up-right",
              "square-binary",
              "square-caret-down",
              "square-caret-left",
              "square-caret-right",
              "square-caret-up",
              "square-check",
              "square-envelope",
              "square-full",
              "square-h",
              "square-minus",
              "square-nfi",
              "square-parking",
              "square-pen",
              "square-person-confined",
              "square-phone",
              "square-phone-flip",
              "square-plus",
              "square-poll-horizontal",
              "square-poll-vertical",
              "square-root-variable",
              "square-rss",
              "square-share-nodes",
              "square-up-right",
              "square-virus",
              "square-xmark",
              "staff-snake",
              "stairs",
              "stamp",
              "stapler",
              "star",
              "star-and-crescent",
              "star-half",
              "star-half-stroke",
              "star-of-david",
              "star-of-life",
              "sterling-sign",
              "stethoscope",
              "stop",
              "stopwatch",
              "stopwatch-20",
              "store",
              "store-slash",
              "street-view",
              "strikethrough",
              "stroopwafel",
              "subscript",
              "suitcase",
              "suitcase-medical",
              "suitcase-rolling",
              "sun",
              "sun-plant-wilt",
              "superscript",
              "swatchbook",
              "synagogue",
              "syringe",
              "t",
              "table",
              "table-cells",
              "table-cells-column-lock",
              "table-cells-large",
              "table-cells-row-lock",
              "table-cells-row-unlock",
              "table-columns",
              "table-list",
              "table-tennis-paddle-ball",
              "tablet",
              "tablet-button",
              "tablet-screen-button",
              "tablets",
              "tachograph-digital",
              "tag",
              "tags",
              "tape",
              "tarp",
              "tarp-droplet",
              "taurus",
              "taxi",
              "teeth",
              "teeth-open",
              "temperature-arrow-down",
              "temperature-arrow-up",
              "temperature-empty",
              "temperature-full",
              "temperature-half",
              "temperature-high",
              "temperature-low",
              "temperature-quarter",
              "temperature-three-quarters",
              "tenge-sign",
              "tent",
              "tent-arrow-down-to-line",
              "tent-arrow-left-right",
              "tent-arrow-turn-left",
              "tent-arrows-down",
              "tents",
              "terminal",
              "text-height",
              "text-slash",
              "text-width",
              "thermometer",
              "thumbs-down",
              "thumbs-up",
              "thumbtack",
              "thumbtack-slash",
              "ticket",
              "ticket-simple",
              "timeline",
              "toggle-off",
              "toggle-on",
              "toilet",
              "toilet-paper",
              "toilet-paper-slash",
              "toilet-portable",
              "toilets-portable",
              "toolbox",
              "tooth",
              "torii-gate",
              "tornado",
              "tower-broadcast",
              "tower-cell",
              "tower-observation",
              "tractor",
              "trademark",
              "traffic-light",
              "trailer",
              "train",
              "train-subway",
              "train-tram",
              "transgender",
              "trash",
              "trash-arrow-up",
              "trash-can",
              "trash-can-arrow-up",
              "tree",
              "tree-city",
              "triangle-exclamation",
              "trophy",
              "trowel",
              "trowel-bricks",
              "truck",
              "truck-arrow-right",
              "truck-droplet",
              "truck-fast",
              "truck-field",
              "truck-field-un",
              "truck-front",
              "truck-medical",
              "truck-monster",
              "truck-moving",
              "truck-pickup",
              "truck-plane",
              "truck-ramp-box",
              "tty",
              "turkish-lira-sign",
              "turn-down",
              "turn-up",
              "tv",
              "u",
              "umbrella",
              "umbrella-beach",
              "underline",
              "universal-access",
              "unlock",
              "unlock-keyhole",
              "up-down",
              "up-down-left-right",
              "up-long",
              "up-right-and-down-left-from-center",
              "up-right-from-square",
              "upload",
              "user",
              "user-astronaut",
              "user-check",
              "user-clock",
              "user-doctor",
              "user-gear",
              "user-graduate",
              "user-group",
              "user-injured",
              "user-lock",
              "user-minus",
              "user-ninja",
              "user-nurse",
              "user-pen",
              "user-plus",
              "user-secret",
              "user-shield",
              "user-slash",
              "user-tag",
              "user-tie",
              "user-xmark",
              "users",
              "users-between-lines",
              "users-gear",
              "users-line",
              "users-rays",
              "users-rectangle",
              "users-slash",
              "users-viewfinder",
              "utensils",
              "v",
              "van-shuttle",
              "vault",
              "venus",
              "venus-double",
              "venus-mars",
              "vest",
              "vest-patches",
              "vial",
              "vial-circle-check",
              "vial-virus",
              "vials",
              "video",
              "video-slash",
              "vihara",
              "virgo",
              "virus",
              "virus-covid",
              "virus-covid-slash",
              "virus-slash",
              "viruses",
              "voicemail",
              "volcano",
              "volleyball",
              "volume",
              "volume-high",
              "volume-low",
              "volume-off",
              "volume-xmark",
              "vr-cardboard",
              "w",
              "walkie-talkie",
              "wallet",
              "wand-magic",
              "wand-magic-sparkles",
              "wand-sparkles",
              "warehouse",
              "water",
              "water-ladder",
              "wave-square",
              "web-awesome",
              "weight-hanging",
              "weight-scale",
              "wheat-awn",
              "wheat-awn-circle-exclamation",
              "wheelchair",
              "wheelchair-move",
              "whiskey-glass",
              "wifi",
              "wind",
              "window-maximize",
              "window-minimize",
              "window-restore",
              "wine-bottle",
              "wine-glass",
              "wine-glass-empty",
              "won-sign",
              "worm",
              "wrench",
              "x",
              "x-ray",
              "xmark",
              "xmarks-lines",
              "y",
              "yen-sign",
              "yin-yang",
              "z"
            ]
          },
          {
            "type": "null"
          }
        ],
        "description": "Optional bundled project icon. Null clears the icon; omitted project edits preserve the existing icon."
      },
      "UndoInput": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "UndoResult": {
        "type": "object",
        "properties": {
          "session": {
            "$ref": "#/components/schemas/WorkSession"
          },
          "revision": {
            "type": "integer",
            "minimum": 0
          }
        },
        "required": [
          "session",
          "revision"
        ],
        "additionalProperties": false
      }
    },
    "parameters": {
      "Id": {
        "name": "id",
        "in": "path",
        "required": true,
        "schema": {
          "$ref": "#/components/schemas/Id"
        }
      },
      "IfMatch": {
        "name": "If-Match",
        "in": "header",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^\"[A-Za-z0-9][A-Za-z0-9._:-]{0,127}\"$"
        },
        "description": "Exactly one strong ETag returned by GET. Missing: 428; malformed/wildcard/list/weak tag: 400; stale: 412."
      },
      "IdempotencyKey": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": true,
        "schema": {
          "type": "string",
          "format": "uuid"
        },
        "description": "Owner-scoped command UUID. Successful responses are durably replayed for at least seven days, including across server restart."
      },
      "Limit": {
        "name": "limit",
        "in": "query",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 500,
          "default": 100
        }
      },
      "Cursor": {
        "name": "cursor",
        "in": "query",
        "schema": {
          "type": "string",
          "minLength": 1,
          "maxLength": 4096
        },
        "description": "Opaque cursor bound to authenticated owner, filters and revision. Invalid: 400; changed revision: 409 CURSOR_EXPIRED."
      },
      "Query": {
        "name": "q",
        "in": "query",
        "schema": {
          "type": "string",
          "maxLength": 200
        },
        "description": "Trimmed, case-insensitive substring match on project/label name or task summary."
      },
      "OwnerBinding": {
        "name": "X-Timekeeper-Owner",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string",
          "minLength": 1,
          "maxLength": 1100,
          "pattern": "^[A-Za-z0-9_-]+$"
        },
        "description": "Optional expected owner for a bound client session: canonical unpadded base64url of its UTF-8 owner ID. Invalid encoding: 400; a different authenticated owner: 401 OWNER_CHANGED before any resource read or mutation. Omission retains stateless token-owner semantics."
      },
      "Csrf": {
        "name": "X-CSRF-Token",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string"
        },
        "description": "Required for cookie-authenticated unsafe methods; obtained from /auth/session. Unnecessary for bearer authentication."
      },
      "AccountKey": {
        "name": "key",
        "in": "path",
        "required": true,
        "schema": {
          "type": "string",
          "pattern": "^[A-Za-z0-9_-]+$"
        },
        "description": "Canonical unpadded base64url UTF-8 owner ID; administrator account management only. Never selects a business-data owner."
      },
      "UndoPreference": {
        "name": "X-Timekeeper-Undo",
        "in": "header",
        "required": false,
        "schema": {
          "type": "string",
          "enum": [
            "true"
          ]
        },
        "description": "Request a ten-minute undo offer for this work-session edit or deletion."
      }
    },
    "responses": {
      "400": {
        "description": "Malformed JSON, parameter, header or unknown input field.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:bad-request",
              "title": "Malformed JSON, parameter, header or unknown input field",
              "status": 400,
              "code": "BAD_REQUEST"
            }
          }
        }
      },
      "401": {
        "description": "Missing, invalid, expired or revoked bearer token, or OWNER_CHANGED when its authenticated owner differs from the expected session owner.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:unauthenticated",
              "title": "Missing, invalid, expired or revoked bearer token",
              "status": 401,
              "code": "UNAUTHENTICATED"
            }
          }
        },
        "headers": {
          "WWW-Authenticate": {
            "schema": {
              "type": "string"
            },
            "description": "Bearer realm=\"timekeeper\"; invalid credentials additionally use error=\"invalid_token\"."
          }
        }
      },
      "403": {
        "description": "Authenticated token lacks the required read/write permission.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:forbidden",
              "title": "Authenticated token lacks the required read/write permission",
              "status": 403,
              "code": "FORBIDDEN"
            }
          }
        }
      },
      "404": {
        "description": "Resource or referenced resource does not exist in the authenticated owner scope.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:not-found",
              "title": "Resource or referenced resource does not exist in the authenticated owner scope",
              "status": 404,
              "code": "NOT_FOUND"
            }
          }
        }
      },
      "409": {
        "description": "Domain conflict, changed cursor revision, active-state mismatch or reused idempotency key with different input.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:conflict",
              "title": "Domain conflict, changed cursor revision, active-state mismatch or reused idempotency key with different input",
              "status": 409,
              "code": "CONFLICT"
            }
          }
        }
      },
      "412": {
        "description": "If-Match does not match the current owned resource version.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:stale-version",
              "title": "If-Match does not match the current owned resource version",
              "status": 412,
              "code": "STALE_VERSION"
            }
          }
        }
      },
      "413": {
        "description": "Request exceeds the global 20 MiB HTTP body limit, or portable transfer exceeds 10,000 records per type / 20 MiB export.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:payload-too-large",
              "title": "Request or portable export exceeds the documented transfer limit",
              "status": 413,
              "code": "PAYLOAD_TOO_LARGE"
            }
          }
        }
      },
      "415": {
        "description": "Unsupported request media type.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:unsupported-media-type",
              "title": "Unsupported request media type",
              "status": 415,
              "code": "UNSUPPORTED_MEDIA_TYPE"
            }
          }
        }
      },
      "422": {
        "description": "Well-formed input violates a field, temporal or relation constraint.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:validation",
              "title": "Well-formed input violates a field, temporal or relation constraint",
              "status": 422,
              "code": "VALIDATION"
            }
          }
        }
      },
      "428": {
        "description": "Required If-Match header is missing.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:precondition-required",
              "title": "Required If-Match header is missing",
              "status": 428,
              "code": "PRECONDITION_REQUIRED"
            }
          }
        }
      },
      "503": {
        "description": "Transient server failure. Retry idempotent commands using the same key.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:unavailable",
              "title": "Transient server failure",
              "status": 503,
              "code": "UNAVAILABLE"
            }
          }
        }
      },
      "429": {
        "description": "Authentication attempts temporarily limited.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:rate-limited",
              "title": "RATE LIMITED",
              "status": 429,
              "code": "RATE_LIMITED"
            }
          }
        }
      },
      "410": {
        "description": "Undo offer expired.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            },
            "example": {
              "type": "urn:timekeeper:problem:undo_expired",
              "title": "Undo offer expired",
              "status": 410,
              "code": "UNDO_EXPIRED"
            }
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "WorkSessions",
      "description": "Independent work periods and optional activity associations."
    },
    {
      "name": "Accounts",
      "description": "User identity, private credentials and administrator account management. Administrator privileges never grant access to another user’s business data."
    }
  ]
}
