{"components":{"schemas":{"Error":{"properties":{"error":{"properties":{"code":{"type":"integer"},"message":{"type":"string"}},"required":["code","message"],"type":"object"}},"required":["error"],"type":"object"},"Project":{"properties":{"description":{"maxLength":5000,"type":"string"},"due_date":{"format":"date","type":["string","null"]},"id":{"type":"integer"},"name":{"maxLength":100,"type":"string"},"status":{"enum":["active","paused","completed","archived"],"type":"string"},"team_id":{"type":["integer","null"]}},"type":"object"},"Task":{"properties":{"assignee_id":{"type":["integer","null"]},"description":{"maxLength":10000,"type":"string"},"due_date":{"format":"date","type":["string","null"]},"estimated_minutes":{"minimum":0,"type":"integer"},"id":{"type":"integer"},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"project_id":{"type":"integer"},"status":{"enum":["backlog","todo","in_progress","in_review","done"],"type":"string"},"title":{"maxLength":160,"type":"string"},"version":{"type":"integer"}},"type":"object"}},"securitySchemes":{"bearerAuth":{"scheme":"bearer","type":"http"},"sessionAuth":{"in":"cookie","name":"session","type":"apiKey"}}},"info":{"description":"Permission-filtered workspace API. Bearer read/write tokens are created in Settings. Browser sessions require X-CSRFToken for mutations. Pass 0 to clear optional assignee/team IDs.","title":"DevTrack API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/analytics/overview":{"get":{"parameters":[{"in":"query","name":"start","schema":{"type":"string"}},{"in":"query","name":"end","schema":{"type":"string"}},{"in":"query","name":"project_id","schema":{"type":"string"}},{"in":"query","name":"team_id","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"string"}}],"responses":{"200":{"description":"JSON data wrapper"},"400":{"description":"Invalid filters"},"401":{"description":"Authentication required"},"403":{"description":"Forbidden"}},"summary":"Permission-filtered analytics: start/end dates, project_id, team_id and status filters"}},"/me":{"get":{"responses":{"200":{"description":"JSON data wrapper"},"400":{"description":"Invalid filters"},"401":{"description":"Authentication required"},"403":{"description":"Forbidden"}},"summary":"Current user (no password hash)"}},"/projects":{"get":{"operationId":"get_projects_collection","parameters":[{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"q","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"string"}},{"in":"query","name":"team_id","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Project"},"type":"array"},"pagination":{"properties":{"page":{"type":"integer"},"pages":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"type":"object"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"}},"summary":"Get projects"},"post":{"operationId":"post_projects_collection","parameters":[{"description":"Required for browser-session mutations; not used by Bearer tokens.","in":"header","name":"X-CSRFToken","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"description":{"maxLength":5000,"type":"string"},"due_date":{"format":"date","type":["string","null"]},"name":{"maxLength":100,"type":"string"},"status":{"enum":["active","paused","completed","archived"],"type":"string"},"team_id":{"type":["integer","null"]}},"required":["name"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Project"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"}},"summary":"Post projects"}},"/projects/{id}":{"delete":{"operationId":"delete_projects_one","parameters":[{"in":"path","name":"id","required":true,"schema":{"minimum":1,"type":"integer"}}],"responses":{"204":{"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"}},"summary":"Delete projects"},"get":{"operationId":"get_projects_one","parameters":[{"in":"path","name":"id","required":true,"schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Project"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"}},"summary":"Get projects"},"patch":{"operationId":"patch_projects_one","parameters":[{"in":"path","name":"id","required":true,"schema":{"minimum":1,"type":"integer"}},{"description":"Required for browser-session mutations; not used by Bearer tokens.","in":"header","name":"X-CSRFToken","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"description":{"maxLength":5000,"type":"string"},"due_date":{"format":"date","type":["string","null"]},"name":{"maxLength":100,"type":"string"},"status":{"enum":["active","paused","completed","archived"],"type":"string"},"team_id":{"type":["integer","null"]}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Project"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"}},"summary":"Patch projects"}},"/tasks":{"get":{"operationId":"get_tasks_collection","parameters":[{"in":"query","name":"page","schema":{"minimum":1,"type":"integer"}},{"in":"query","name":"per_page","schema":{"maximum":100,"minimum":1,"type":"integer"}},{"in":"query","name":"q","schema":{"type":"string"}},{"in":"query","name":"status","schema":{"type":"string"}},{"in":"query","name":"priority","schema":{"type":"string"}},{"in":"query","name":"project_id","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Task"},"type":"array"},"pagination":{"properties":{"page":{"type":"integer"},"pages":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"}},"type":"object"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"}},"summary":"Get tasks"},"post":{"operationId":"post_tasks_collection","parameters":[{"description":"Required for browser-session mutations; not used by Bearer tokens.","in":"header","name":"X-CSRFToken","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"assignee_id":{"type":["integer","null"]},"description":{"maxLength":10000,"type":"string"},"due_date":{"format":"date","type":["string","null"]},"estimated_minutes":{"minimum":0,"type":"integer"},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"project_id":{"type":"integer"},"status":{"enum":["backlog","todo","in_progress","in_review","done"],"type":"string"},"title":{"maxLength":160,"type":"string"},"version":{"type":"integer"}},"required":["project_id","title"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Task"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"}},"summary":"Post tasks"}},"/tasks/{id}":{"delete":{"operationId":"delete_tasks_one","parameters":[{"in":"path","name":"id","required":true,"schema":{"minimum":1,"type":"integer"}}],"responses":{"204":{"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"}},"summary":"Delete tasks"},"get":{"operationId":"get_tasks_one","parameters":[{"in":"path","name":"id","required":true,"schema":{"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Task"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"}},"summary":"Get tasks"},"patch":{"operationId":"patch_tasks_one","parameters":[{"in":"path","name":"id","required":true,"schema":{"minimum":1,"type":"integer"}},{"description":"Required for browser-session mutations; not used by Bearer tokens.","in":"header","name":"X-CSRFToken","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"assignee_id":{"type":["integer","null"]},"description":{"maxLength":10000,"type":"string"},"due_date":{"format":"date","type":["string","null"]},"estimated_minutes":{"minimum":0,"type":"integer"},"priority":{"enum":["low","medium","high","urgent"],"type":"string"},"project_id":{"type":"integer"},"status":{"enum":["backlog","todo","in_progress","in_review","done"],"type":"string"},"title":{"maxLength":160,"type":"string"},"version":{"type":"integer"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/Task"}},"type":"object"}}},"description":"Success"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"Error"}},"summary":"Patch tasks"}}},"security":[{"bearerAuth":[]},{"sessionAuth":[]}],"servers":[{"url":"/api/v1"}]}
