{"openapi":"3.1.0","info":{"title":"NOAST Timer API","version":"1.0.0","description":"Time tracking and fees. Auth: `Authorization: Bearer nst_...` (create tokens in the app settings). Money values are in the user's currency units; durations in seconds; times ISO 8601."},"servers":[{"url":"/api/v1"}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer"}}},"security":[{"bearer":[]}],"paths":{"/me":{"get":{"summary":"Current user and settings (hourly_rate, currency, timezone)","responses":{"200":{"description":"OK"}}},"patch":{"summary":"Update settings","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"hourly_rate":{"type":"number"},"currency":{"type":"string"},"timezone":{"type":"string"}}}}}},"responses":{"200":{"description":"OK"}}}},"/projects":{"get":{"summary":"List projects","parameters":[{"name":"archived","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK"}}},"post":{"summary":"Create project","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}}}}}},"responses":{"201":{"description":"Created"}}}},"/projects/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"get":{"summary":"Get project with notes","responses":{"200":{"description":"OK"}}},"patch":{"summary":"Rename, archive or replace notes","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"notes":{"type":"string"},"archived":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK"}}},"delete":{"summary":"Delete project and its entries","responses":{"200":{"description":"OK"}}}},"/projects/{id}/notes":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"post":{"summary":"Append a line to the project notes","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"}}}}}},"responses":{"200":{"description":"OK"}}}},"/timer":{"get":{"summary":"Running timer, or null","responses":{"200":{"description":"OK"}}}},"/timer/start":{"post":{"summary":"Start timer on a project (stops any running one)","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"project_id":{"type":"string"},"project":{"type":"string","description":"Project name (case-insensitive), alternative to project_id"},"note":{"type":"string"}}}}}},"responses":{"201":{"description":"Started"}}}},"/timer/stop":{"post":{"summary":"Stop running timer","responses":{"200":{"description":"OK"}}}},"/entries":{"get":{"summary":"List time entries of a month","parameters":[{"name":"month","in":"query","schema":{"type":"string","example":"2026-11"},"description":"YYYY-MM in the user's timezone; default current month"},{"name":"project_id","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"post":{"summary":"Log time after the fact (give ended_at or minutes)","requestBody":{"content":{"application/json":{"schema":{"type":"object","required":["started_at"],"properties":{"project_id":{"type":"string"},"project":{"type":"string","description":"Project name (case-insensitive), alternative to project_id"},"started_at":{"type":"string","format":"date-time"},"ended_at":{"type":"string","format":"date-time"},"minutes":{"type":"number"},"note":{"type":"string"}}}}}},"responses":{"201":{"description":"Created"}}}},"/entries/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"patch":{"summary":"Edit entry","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"project_id":{"type":"string"},"started_at":{"type":"string"},"ended_at":{"type":"string"},"note":{"type":"string"}}}}}},"responses":{"200":{"description":"OK"}}},"delete":{"summary":"Delete entry","responses":{"200":{"description":"OK"}}}},"/summary":{"get":{"summary":"Seconds and fees per project for a month","parameters":[{"name":"month","in":"query","schema":{"type":"string","example":"2026-11"},"description":"YYYY-MM in the user's timezone; default current month"}],"responses":{"200":{"description":"OK"}}}}}}