{"openapi":"3.0.3","info":{"title":"Aura Tec Projects API","version":"1.2.1","description":"Track Aura Tec projects, their tasks/milestones and progress updates. Authenticate with `Authorization: Bearer <key>`. Scopes: read (GET only), write (read + create/update/delete), admin (write + audit log). Rate limit: 120 requests/minute per key. All writes are audit-logged."},"servers":[{"url":"/"}],"security":[{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","bearerFormat":"aura_<prefix>_<secret>"}},"schemas":{"Project":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,62}$"},"name":{"type":"string"},"client":{"type":"string","nullable":true},"owner":{"type":"string","nullable":true},"status":{"type":"string","enum":["idea","planned","active","paused","done"]},"priority":{"type":"string","enum":["low","medium","high","critical"],"nullable":true},"description":{"type":"string","nullable":true},"repo_url":{"type":"string","format":"uri","nullable":true},"site_urls":{"type":"array","items":{"type":"string","format":"uri"}},"start_date":{"type":"string","format":"date","nullable":true},"target_date":{"type":"string","format":"date","nullable":true},"tags":{"type":"array","items":{"type":"string"}},"notes":{"type":"string","nullable":true},"created_at":{"type":"string","format":"date-time","readOnly":true},"updated_at":{"type":"string","format":"date-time","readOnly":true},"created_by":{"type":"string","readOnly":true},"updated_by":{"type":"string","readOnly":true},"task_counts":{"type":"object","readOnly":true},"latest_update":{"type":"object","nullable":true,"readOnly":true}}},"ProjectInput":{"type":"object","required":["name"],"properties":{"slug":{"type":"string","pattern":"^[a-z0-9][a-z0-9-]{0,62}$"},"name":{"type":"string"},"client":{"type":"string","nullable":true},"owner":{"type":"string","nullable":true},"status":{"type":"string","enum":["idea","planned","active","paused","done"]},"priority":{"type":"string","enum":["low","medium","high","critical"],"nullable":true},"description":{"type":"string","nullable":true},"repo_url":{"type":"string","format":"uri","nullable":true},"site_urls":{"type":"array","items":{"type":"string","format":"uri"}},"start_date":{"type":"string","format":"date","nullable":true},"target_date":{"type":"string","format":"date","nullable":true},"tags":{"type":"array","items":{"type":"string"}},"notes":{"type":"string","nullable":true}}},"ProjectList":{"type":"object","properties":{"total":{"type":"integer"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Project"}}}},"Task":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"project_id":{"type":"integer","readOnly":true},"title":{"type":"string"},"description":{"type":"string","nullable":true},"kind":{"type":"string","enum":["task","milestone"]},"status":{"type":"string","enum":["todo","doing","blocked","done"]},"assignee":{"type":"string","nullable":true},"due_date":{"type":"string","format":"date","nullable":true},"sort":{"type":"integer"},"created_at":{"type":"string","readOnly":true},"updated_at":{"type":"string","readOnly":true}}},"TaskInput":{"type":"object","required":["title"],"properties":{"title":{"type":"string"},"description":{"type":"string","nullable":true},"kind":{"type":"string","enum":["task","milestone"]},"status":{"type":"string","enum":["todo","doing","blocked","done"]},"assignee":{"type":"string","nullable":true},"due_date":{"type":"string","format":"date","nullable":true},"sort":{"type":"integer"}}},"TaskList":{"type":"object","properties":{"total":{"type":"integer"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Task"}}}},"Update":{"type":"object","properties":{"id":{"type":"integer","readOnly":true},"project_id":{"type":"integer","readOnly":true},"kind":{"type":"string","enum":["note","status","milestone","blocker","decision"]},"body":{"type":"string"},"author":{"type":"string","nullable":true,"description":"Defaults to the API key name / username"},"created_at":{"type":"string","readOnly":true}}},"UpdateInput":{"type":"object","required":["body"],"properties":{"kind":{"type":"string","enum":["note","status","milestone","blocker","decision"]},"body":{"type":"string"},"author":{"type":"string","nullable":true,"description":"Defaults to the API key name / username"}}},"UpdateList":{"type":"object","properties":{"total":{"type":"integer"},"items":{"type":"array","items":{"$ref":"#/components/schemas/Update"}}}},"Error":{"type":"object","properties":{"error":{"type":"string"}}}}},"paths":{"/projects/api/v1/me":{"get":{"summary":"Who am I (key name and scope)","description":"Required scope: read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}}},"/projects/api/v1/projects":{"get":{"summary":"List projects","description":"Required scope: read","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"status","in":"query","description":"Comma list of statuses","schema":{"type":"string"}},{"name":"view","in":"query","description":"current = active+paused, future = idea+planned, done","schema":{"type":"string","enum":["current","future","done","all"]}},{"name":"q","in":"query","description":"Search name, slug, client, description, notes, tags","schema":{"type":"string"}},{"name":"tag","in":"query","schema":{"type":"string"}},{"name":"client","in":"query","schema":{"type":"string"}},{"name":"priority","in":"query","schema":{"type":"string","enum":["low","medium","high","critical"]}},{"name":"sort","in":"query","schema":{"type":"string","enum":["priority","name","updated","target_date"],"default":"priority"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectList"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}},"post":{"summary":"Create project","description":"Required scope: write","parameters":[],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectInput"}}}}}},"/projects/api/v1/projects/{project}":{"get":{"summary":"Get project (with tasks and recent updates)","description":"Required scope: read","parameters":[{"name":"project","in":"path","required":true,"description":"Project numeric id or slug","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}},"patch":{"summary":"Update project fields (partial)","description":"Required scope: write","parameters":[{"name":"project","in":"path","required":true,"description":"Project numeric id or slug","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Project"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectInput"}}}}},"delete":{"summary":"Delete project and its tasks/updates (snapshot kept in audit log)","description":"Required scope: write","parameters":[{"name":"project","in":"path","required":true,"description":"Project numeric id or slug","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}}},"/projects/api/v1/projects/{project}/tasks":{"get":{"summary":"List tasks","description":"Required scope: read","parameters":[{"name":"project","in":"path","required":true,"description":"Project numeric id or slug","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskList"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}},"post":{"summary":"Create task or milestone","description":"Required scope: write","parameters":[{"name":"project","in":"path","required":true,"description":"Project numeric id or slug","schema":{"type":"string"}}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskInput"}}}}}},"/projects/api/v1/tasks/{id}":{"get":{"summary":"Get task","description":"Required scope: read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}},"patch":{"summary":"Update task (partial)","description":"Required scope: write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Task"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskInput"}}}}},"delete":{"summary":"Delete task","description":"Required scope: write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}}},"/projects/api/v1/projects/{project}/updates":{"get":{"summary":"List progress updates (newest first)","description":"Required scope: read","parameters":[{"name":"project","in":"path","required":true,"description":"Project numeric id or slug","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateList"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}},"post":{"summary":"Post a progress update","description":"Required scope: write","parameters":[{"name":"project","in":"path","required":true,"description":"Project numeric id or slug","schema":{"type":"string"}}],"responses":{"201":{"description":"Created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Update"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInput"}}}}}},"/projects/api/v1/updates":{"get":{"summary":"Recent updates across all projects (newest first)","description":"Required scope: read","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}},{"name":"since","in":"query","description":"ISO timestamp (UTC), e.g. 2026-11-10T00:00:00Z","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateList"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}}},"/projects/api/v1/updates/{id}":{"patch":{"summary":"Edit an update","description":"Required scope: write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Update"}}}},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateInput"}}}}},"delete":{"summary":"Delete an update","description":"Required scope: write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}}},"/projects/api/v1/audit":{"get":{"summary":"Audit log of writes (newest first)","description":"Required scope: admin","parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500}},{"name":"offset","in":"query","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}}},"/projects/api/v1/meta":{"get":{"summary":"Allowed enum values","description":"Required scope: read","parameters":[],"responses":{"200":{"description":"OK"},"401":{"description":"Missing or invalid credentials"},"403":{"description":"Key scope does not allow this"},"404":{"description":"Not found"},"422":{"description":"Validation error"},"429":{"description":"Rate limited"}}}}}}