{"openapi":"3.1.0","info":{"title":"Startrust Office API","version":"1.0.0","description":"Startrust Office API。\n\n**兩種認證方式：**\n\n1. **API 金鑰**（`Authorization: Bearer stpix_live_xxx` / `stpix_test_xxx`）——\n   **唯讀**。任何非 GET/HEAD 的請求都會被擋下並回 403\n   （`lib/api-access.ts`）。金鑰另帶資料範圍政策（dataPolicy）。\n2. **Session Cookie**——`POST /api/auth/login` 成功後會種下 httpOnly\n   的 session cookie（`sameSite=lax`），後續請求帶著它即可。寫入類\n   端點只有這條路走得通。\n\n本規格只列出 API 金鑰可用的唯讀端點，外加認證相關的幾支。"},"servers":[{"url":"https://loverd.startrust.io","description":"Current site"},{"url":"https://loverd.startrust.io","description":"Loverd production site"}],"tags":[{"name":"Auth"},{"name":"API Access"},{"name":"Projects"},{"name":"Tasks"},{"name":"Tags"},{"name":"Articles"},{"name":"Sites"},{"name":"Systems"},{"name":"Employees"},{"name":"Me"},{"name":"Settings"}],"paths":{"/api/auth/login":{"post":{"summary":"Log in with email and password","operationId":"login","tags":["Auth"],"security":[],"description":"成功時回 `{ ok: true }`，並以 `Set-Cookie` 種下 httpOnly 的 session cookie；**回應主體裡沒有 token**。呼叫端必須保留 cookie（瀏覽器自動處理；curl 用 `-c/-b`，fetch 用 `credentials: \"include\"`）。","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","maxLength":255,"description":"不分大小寫。"},"password":{"type":"string","maxLength":256}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"400":{"description":"invalid_input：欄位驗證失敗"},"401":{"description":"invalid_credentials：帳號或密碼不正確（帳號停用或未設本地密碼也回這個）"},"429":{"description":"too_many_attempts：同一組 (IP, email) 15 分鐘內失敗 8 次即進入冷卻"}}}},"/api/auth/logout":{"post":{"summary":"Log out","operationId":"logout","tags":["Auth"],"security":[],"description":"清除 session cookie。沒有登入時呼叫也會回 200。","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}}}}},"/api/auth/change-password":{"post":{"summary":"Change own password","operationId":"changePassword","tags":["Auth"],"security":[{"cookieAuth":[]}],"description":"成功後會推進帳號的 session epoch——**其他裝置上的既有 session 會全部失效**。","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["currentPassword","newPassword"],"properties":{"currentPassword":{"type":"string"},"newPassword":{"type":"string","maxLength":256,"description":"需符合系統密碼原則。"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["ok"],"properties":{"ok":{"type":"boolean","const":true}}}}}},"400":{"description":"invalid_input / invalid_password_policy / no_local_password"},"401":{"description":"invalid_credentials：目前密碼不正確"}}}},"/api/api-access/key-info":{"get":{"summary":"Inspect current API key policy","operationId":"getApiKeyInfo","security":[{"bearerAuth":[]}],"tags":["API Access"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyInfo"}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/projects":{"get":{"summary":"List projects","operationId":"listProjects","security":[{"bearerAuth":[]}],"tags":["Projects"],"parameters":[{"name":"archived","in":"query","required":false,"description":"Set \"true\" to include archived projects.","schema":{"type":"string","enum":["true"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ProjectListItem"}},"total":{"type":"number"}}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/projects/{id}":{"get":{"summary":"Get project","operationId":"getProject","security":[{"bearerAuth":[]}],"tags":["Projects"],"parameters":[{"name":"id","in":"path","required":true,"description":"Project UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/projects/{id}/tasks":{"get":{"summary":"List project tasks","operationId":"listProjectTasks","security":[{"bearerAuth":[]}],"tags":["Projects","Tasks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Project UUID","schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"description":"Page size (default 200, max 500).","schema":{"type":"number"}},{"name":"offset","in":"query","required":false,"description":"Row offset (default 0).","schema":{"type":"number"}},{"name":"archived","in":"query","required":false,"description":"Page filter (default all). Aggregate totals always cover the whole project.","schema":{"type":"string","enum":["all","active"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"total":{"type":"number"},"activeTotal":{"type":"number"},"archivedTotal":{"type":"number"},"resolvedTotal":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/projects/{id}/members":{"get":{"summary":"List project members","operationId":"listProjectMembers","security":[{"bearerAuth":[]}],"tags":["Projects"],"parameters":[{"name":"id","in":"path","required":true,"description":"Project UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectMemberListItem"}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/projects/{id}/custom-fields":{"get":{"summary":"List project custom fields","operationId":"listProjectCustomFields","security":[{"bearerAuth":[]}],"tags":["Projects"],"parameters":[{"name":"id","in":"path","required":true,"description":"Project UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomField"}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/projects/{id}/tags":{"get":{"summary":"List project task tags","operationId":"listProjectTags","security":[{"bearerAuth":[]}],"tags":["Projects","Tags"],"description":"標籤隸屬於專案，依 ordinal、name 排序。建立／修改／刪除標籤的端點存在，但 API 金鑰只允許 GET/HEAD，所以此處不列出。","parameters":[{"name":"id","in":"path","required":true,"description":"Project UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaskTag"}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/tasks":{"get":{"summary":"List tasks","operationId":"listTasks","security":[{"bearerAuth":[]}],"tags":["Tasks"],"parameters":[{"name":"q","in":"query","required":false,"description":"Keyword search.","schema":{"type":"string"}},{"name":"projectIds","in":"query","required":false,"description":"Comma-separated project UUIDs.","schema":{"type":"string"}},{"name":"assignees","in":"query","required":false,"description":"Comma-separated employee UUIDs, may include \"me\".","schema":{"type":"string"}},{"name":"statuses","in":"query","required":false,"description":"Comma-separated task statuses.","schema":{"type":"string"}},{"name":"priorities","in":"query","required":false,"description":"Comma-separated priorities.","schema":{"type":"string"}},{"name":"taskTypes","in":"query","required":false,"description":"Comma-separated task types.","schema":{"type":"string"}},{"name":"tagNames","in":"query","required":false,"description":"Comma-separated tag names.","schema":{"type":"string"}},{"name":"resolved","in":"query","required":false,"description":"Resolution filter.","schema":{"type":"string","enum":["all","open","resolved"]}},{"name":"archived","in":"query","required":false,"description":"Archive filter.","schema":{"type":"string","enum":["all","active","archived"]}},{"name":"from","in":"query","required":false,"description":"Start date lower bound.","schema":{"type":"string"}},{"name":"to","in":"query","required":false,"description":"End date upper bound.","schema":{"type":"string"}},{"name":"mineAdditional","in":"query","required":false,"description":"Include tasks where the caller is an additional member.","schema":{"type":"boolean"}},{"name":"sort","in":"query","required":false,"description":"Sort key.","schema":{"type":"string","enum":["updated","priority","startAt","endAt","idReadable"]}},{"name":"limit","in":"query","required":false,"description":"Maximum result count.","schema":{"type":"number"}},{"name":"offset","in":"query","required":false,"description":"Row offset (default 0).","schema":{"type":"number"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"total":{"type":"number"}}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/tasks/{id}":{"get":{"summary":"Get task","operationId":"getTask","security":[{"bearerAuth":[]}],"tags":["Tasks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Task UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/tasks/{id}/comments":{"get":{"summary":"List task comments","operationId":"listTaskComments","security":[{"bearerAuth":[]}],"tags":["Tasks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Task UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/tasks/{id}/attachments":{"get":{"summary":"List task attachments","operationId":"listTaskAttachments","security":[{"bearerAuth":[]}],"tags":["Tasks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Task UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Attachment"}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/tasks/{id}/custom-values":{"get":{"summary":"List task custom values","operationId":"listTaskCustomValues","security":[{"bearerAuth":[]}],"tags":["Tasks"],"parameters":[{"name":"id","in":"path","required":true,"description":"Task UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaskCustomValue"}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/articles":{"get":{"summary":"List articles","operationId":"listArticles","security":[{"bearerAuth":[]}],"tags":["Articles"],"parameters":[{"name":"q","in":"query","required":false,"description":"Title keyword search.","schema":{"type":"string"}},{"name":"projectId","in":"query","required":false,"description":"Project UUID.","schema":{"type":"string","format":"uuid"}},{"name":"includeArchived","in":"query","required":false,"description":"Set \"1\" to include archived articles.","schema":{"type":"string","enum":["1"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ArticleListItem"}},"total":{"type":"number"}}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/articles/{id}":{"get":{"summary":"Get article","operationId":"getArticle","security":[{"bearerAuth":[]}],"tags":["Articles"],"parameters":[{"name":"id","in":"path","required":true,"description":"Article UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Article"}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/articles/{id}/comments":{"get":{"summary":"List article comments","operationId":"listArticleComments","security":[{"bearerAuth":[]}],"tags":["Articles"],"parameters":[{"name":"id","in":"path","required":true,"description":"Article UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/articles/{id}/attachments":{"get":{"summary":"List article attachments","operationId":"listArticleAttachments","security":[{"bearerAuth":[]}],"tags":["Articles"],"parameters":[{"name":"id","in":"path","required":true,"description":"Article UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Attachment"}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/sites":{"get":{"summary":"List sites","operationId":"listSites","security":[{"bearerAuth":[]}],"tags":["Sites"],"parameters":[{"name":"archived","in":"query","required":false,"description":"Set \"true\" to include archived sites.","schema":{"type":"string","enum":["true"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Site"}},"total":{"type":"number"}}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/sites/{id}":{"get":{"summary":"Get site","operationId":"getSite","security":[{"bearerAuth":[]}],"tags":["Sites"],"parameters":[{"name":"id","in":"path","required":true,"description":"Site UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site"}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/sites/{id}/health/summary":{"get":{"summary":"Get site health summary","operationId":"getSiteHealthSummary","security":[{"bearerAuth":[]}],"tags":["Sites"],"parameters":[{"name":"id","in":"path","required":true,"description":"Site UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteHealthSummary"}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/systems":{"get":{"summary":"List software systems","operationId":"listSystems","security":[{"bearerAuth":[]}],"tags":["Systems"],"parameters":[{"name":"archived","in":"query","required":false,"description":"Set \"true\" to include archived systems.","schema":{"type":"string","enum":["true"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/SoftwareSystem"}},"total":{"type":"number"}}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/systems/{id}":{"get":{"summary":"Get software system","operationId":"getSystem","security":[{"bearerAuth":[]}],"tags":["Systems"],"parameters":[{"name":"id","in":"path","required":true,"description":"System UUID","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SoftwareSystem"}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/systems/{id}/branches":{"get":{"summary":"List software system branches","operationId":"listSystemBranches","security":[{"bearerAuth":[]}],"tags":["Systems"],"parameters":[{"name":"id","in":"path","required":true,"description":"System UUID","schema":{"type":"string","format":"uuid"}},{"name":"archived","in":"query","required":false,"description":"Set \"true\" to include archived branches.","schema":{"type":"string","enum":["true"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SoftwareSystemBranch"}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/systems/{id}/branches/{branchId}/versions":{"get":{"summary":"List software branch versions","operationId":"listSystemBranchVersions","security":[{"bearerAuth":[]}],"tags":["Systems"],"parameters":[{"name":"id","in":"path","required":true,"description":"System UUID","schema":{"type":"string","format":"uuid"}},{"name":"branchId","in":"path","required":true,"description":"Branch UUID","schema":{"type":"string","format":"uuid"}},{"name":"archived","in":"query","required":false,"description":"Set \"true\" to include archived versions.","schema":{"type":"string","enum":["true"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SoftwareSystemVersion"}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/employees":{"get":{"summary":"List employees","operationId":"listEmployees","security":[{"bearerAuth":[]}],"tags":["Employees"],"parameters":[{"name":"search","in":"query","required":false,"description":"Display name keyword search.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum result count.","schema":{"type":"number","maximum":50}},{"name":"activeOnly","in":"query","required":false,"description":"Only active employees.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/EmployeeListItem"}},"total":{"type":"number"}}}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/employees/{id}":{"get":{"summary":"Get employee detail","operationId":"getEmployee","security":[{"bearerAuth":[]}],"tags":["Employees"],"parameters":[{"name":"id","in":"path","required":true,"description":"Employee UUID or \"me\".","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeDetail"}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/auth/me":{"get":{"summary":"Get current identity","operationId":"getMe","security":[{"bearerAuth":[]}],"tags":["Me"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Me"}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}},"/api/settings/system":{"get":{"summary":"Get public system settings","operationId":"getSystemSettings","security":[{"bearerAuth":[]}],"tags":["Settings"],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSystemSettings"}}}},"401":{"description":"Unauthorized: missing or invalid session/API key"},"403":{"description":"Forbidden: insufficient capability or API key data policy"},"404":{"description":"Not found"}}}}},"components":{"securitySchemes":{"cookieAuth":{"type":"apiKey","in":"cookie","name":"pixeloffice_session","description":"POST /api/auth/login 成功後由伺服器種下的 httpOnly session cookie。名稱可由 SESSION_COOKIE_NAME 環境變數覆寫。寫入類端點需要它。"},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"API Key or session JWT","description":"Use an API key such as `Bearer stpix_live_xxx`."}},"schemas":{"ApiKeyInfo":{"type":"object","properties":{"integration":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"environment":{"type":"string","enum":["development","staging","production"]}},"additionalProperties":true},"key":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"prefix":{"type":"string"},"expiresAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"dataPolicy":{"type":"object","properties":{"includeArchived":{"type":"boolean"},"projectIds":{"type":"array","items":{"type":"string"}},"siteIds":{"type":"array","items":{"type":"string"}},"systemIds":{"type":"array","items":{"type":"string"}},"employeeIds":{"type":"array","items":{"type":"string"}},"environments":{"type":"array","items":{"type":"string","enum":["development","staging","production"]}}},"additionalProperties":true}},"additionalProperties":true},"serverTime":{"type":"string","format":"date-time"}},"additionalProperties":true},"ProjectListItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"shortName":{"oneOf":[{"type":"string"},{"type":"null"}]},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"ownerEmployeeId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"ownerDisplayName":{"oneOf":[{"type":"string"},{"type":"null"}]},"ownerAvatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]},"taskCount":{"type":"number"},"openTaskCount":{"type":"number"},"isFavorite":{"type":"boolean"},"isArchived":{"type":"boolean"},"myRole":{"oneOf":[{"type":"string","enum":["owner","editor","viewer"]},{"type":"null"}]},"accessSource":{"oneOf":[{"type":"string","enum":["membership","scope_bypass"]},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"shortName":{"oneOf":[{"type":"string"},{"type":"null"}]},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"ownerEmployeeId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"isArchived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"ProjectMemberListItem":{"type":"object","properties":{"employeeId":{"type":"string","format":"uuid"},"displayName":{"type":"string"},"email":{"oneOf":[{"type":"string"},{"type":"null"}]},"avatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]},"role":{"type":"string","enum":["owner","editor","viewer"]},"addedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"CustomField":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"name":{"type":"string"},"type":{"type":"string"},"systemKey":{"oneOf":[{"type":"string"},{"type":"null"}]},"canBeEmpty":{"type":"boolean"},"isPublic":{"type":"boolean"},"ordinal":{"type":"number"},"emptyFieldText":{"oneOf":[{"type":"string"},{"type":"null"}]},"options":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"ordinal":{"type":"number"}},"additionalProperties":true}}},"additionalProperties":true},"TaskTag":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"colorBg":{"type":"string"},"colorFg":{"type":"string"},"ordinal":{"type":"number"},"createdAt":{"type":"string"}},"additionalProperties":true},"Task":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"numberInProject":{"type":"number"},"idReadable":{"type":"string"},"name":{"type":"string"},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string"},"priority":{"type":"string","enum":["critical","major","normal","minor"]},"assignee":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"displayName":{"type":"string"},"avatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":true},{"type":"null"}]},"additionalMembers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"displayName":{"type":"string"},"avatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":true}},"taskTypes":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"colorBg":{"type":"string"},"colorFg":{"type":"string"}},"additionalProperties":true}},"relatedProjectIds":{"type":"array","items":{"type":"string"}},"startAt":{"oneOf":[{"type":"string","format":"date"},{"type":"null"}]},"endAt":{"oneOf":[{"type":"string","format":"date"},{"type":"null"}]},"resolvedAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"isDraft":{"type":"boolean"},"isArchived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"Comment":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"text":{"type":"string"},"author":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"displayName":{"type":"string"},"avatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":true},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"Attachment":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"mimeType":{"oneOf":[{"type":"string"},{"type":"null"}]},"byteSize":{"type":"number"},"url":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"TaskCustomValue":{"type":"object","properties":{"customFieldId":{"type":"string","format":"uuid"},"optionId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"employeeId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"employeeIds":{"type":"array","items":{"type":"string"}},"dateValue":{"oneOf":[{"type":"string","format":"date"},{"type":"null"}]}},"additionalProperties":true},"ArticleListItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"projectShortName":{"oneOf":[{"type":"string"},{"type":"null"}]},"parentArticleId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"title":{"type":"string"},"ordinal":{"type":"number"},"isPublished":{"type":"boolean"},"isArchived":{"type":"boolean"},"hasChildren":{"type":"boolean"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"Article":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"projectId":{"type":"string","format":"uuid"},"projectName":{"oneOf":[{"type":"string"},{"type":"null"}]},"projectShortName":{"oneOf":[{"type":"string"},{"type":"null"}]},"parentArticleId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"title":{"type":"string"},"content":{"type":"string"},"ordinal":{"type":"number"},"isPublished":{"type":"boolean"},"isArchived":{"type":"boolean"},"author":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"displayName":{"type":"string"},"avatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":true},{"type":"null"}]},"hasChildren":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"Site":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"status":{"type":"string"},"environment":{"type":"string","enum":["development","staging","production"]},"urls":{"type":"array","items":{"type":"string"}},"repoUrl":{"oneOf":[{"type":"string"},{"type":"null"}]},"branchName":{"oneOf":[{"type":"string"},{"type":"null"}]},"version":{"oneOf":[{"type":"string"},{"type":"null"}]},"softwareSystemId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"softwareSystemName":{"oneOf":[{"type":"string"},{"type":"null"}]},"softwareSystemCode":{"oneOf":[{"type":"string"},{"type":"null"}]},"softwareSystemBranchId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"softwareSystemBranchName":{"oneOf":[{"type":"string"},{"type":"null"}]},"softwareSystemVersionId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"softwareSystemVersionNumber":{"oneOf":[{"type":"string"},{"type":"null"}]},"hostedOn":{"oneOf":[{"type":"string"},{"type":"null"}]},"techStack":{"type":"array","items":{"type":"string"}},"ownerEmployeeId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"ownerDisplayName":{"oneOf":[{"type":"string"},{"type":"null"}]},"ownerAvatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]},"projectId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"projectName":{"oneOf":[{"type":"string"},{"type":"null"}]},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"notes":{"oneOf":[{"type":"string"},{"type":"null"}]},"isArchived":{"type":"boolean"},"healthStatus":{"oneOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"SiteHealthSummary":{"type":"object","properties":{"siteId":{"type":"string","format":"uuid"},"status":{"type":"string"},"totalMonitors":{"type":"number"},"requiredMonitors":{"type":"number"},"activeIssues":{"type":"number"},"uptime24h":{"oneOf":[{"type":"number"},{"type":"null"}]},"avgLatencyMs":{"oneOf":[{"type":"number"},{"type":"null"}]},"fastestIntervalSeconds":{"oneOf":[{"type":"number"},{"type":"null"}]},"nextCheck":{"oneOf":[{"type":"object","properties":{"monitorId":{"type":"string","format":"uuid"},"monitorName":{"type":"string"},"at":{"type":"string","format":"date-time"}},"additionalProperties":true},{"type":"null"}]}},"additionalProperties":true},"SoftwareSystem":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"code":{"type":"string"},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"ownerEmployeeId":{"oneOf":[{"type":"string","format":"uuid"},{"type":"null"}]},"ownerDisplayName":{"oneOf":[{"type":"string"},{"type":"null"}]},"ownerAvatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]},"branchCount":{"type":"number"},"versionCount":{"type":"number"},"latestVersion":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"branchId":{"type":"string","format":"uuid"},"branchName":{"type":"string"},"versionNumber":{"type":"string"},"status":{"type":"string"},"releaseDate":{"oneOf":[{"type":"string","format":"date"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},{"type":"null"}]},"isArchived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"SoftwareSystemBranch":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"systemId":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"versionCount":{"type":"number"},"latestVersion":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"branchId":{"type":"string","format":"uuid"},"branchName":{"type":"string"},"versionNumber":{"type":"string"},"status":{"type":"string"},"releaseDate":{"oneOf":[{"type":"string","format":"date"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},{"type":"null"}]},"isArchived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"SoftwareSystemVersion":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"systemId":{"type":"string","format":"uuid"},"branchId":{"type":"string","format":"uuid"},"branchName":{"oneOf":[{"type":"string"},{"type":"null"}]},"versionNumber":{"type":"string"},"status":{"type":"string"},"releaseDate":{"oneOf":[{"type":"string","format":"date"},{"type":"null"}]},"description":{"oneOf":[{"type":"string"},{"type":"null"}]},"isArchived":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"additionalProperties":true},"EmployeeListItem":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"displayName":{"type":"string"},"email":{"oneOf":[{"type":"string"},{"type":"null"}]},"avatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]},"isActive":{"type":"boolean"},"hasActiveAccount":{"type":"boolean"}},"additionalProperties":true},"EmployeeDetail":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"displayName":{"type":"string"},"email":{"oneOf":[{"type":"string"},{"type":"null"}]},"avatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]},"bio":{"oneOf":[{"type":"string"},{"type":"null"}]},"isActive":{"type":"boolean"},"hasActiveAccount":{"type":"boolean"}},"additionalProperties":true},"Me":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"email":{"type":"string"},"displayName":{"type":"string"},"avatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]},"roleId":{"type":"string"},"roleName":{"type":"string"},"roleTemplateId":{"oneOf":[{"type":"string"},{"type":"null"}]},"capabilities":{"type":"array","items":{"type":"string"}},"hasLocalPassword":{"type":"boolean"},"msLinked":{"type":"boolean"},"employee":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"displayName":{"type":"string"},"avatarUrl":{"oneOf":[{"type":"string"},{"type":"null"}]}},"additionalProperties":true},"unreadNotificationCount":{"type":"number"}},"additionalProperties":true},"PublicSystemSettings":{"type":"object","properties":{"systemName":{"type":"string"},"systemLogoUrl":{"oneOf":[{"type":"string"},{"type":"null"}]},"allowedEmailDomain":{"type":"string"},"passwordPolicy":{"type":"object","properties":{"minLength":{"type":"number"},"requireLowercase":{"type":"boolean"},"requireUppercase":{"type":"boolean"},"requireNumber":{"type":"boolean"},"requireSymbol":{"type":"boolean"}},"additionalProperties":true},"passwordPolicyHint":{"type":"string"},"entraEnabled":{"type":"boolean"}},"additionalProperties":true}}}}