{"openapi":"3.1.0","info":{"title":"Prototype API","version":"1.0.0","summary":"REST at /api/v1. Reads across the workspace, writes for documentation, tasks and meetings.","description":"Read projects, specs, components, milestones, tasks, documentation pages, the document library and meetings. Write documentation pages, library links, tasks and meeting minutes with the four write scopes. Authenticate with `Authorization: Bearer ptk_live_…`; tokens are minted under Admin, then Integrations.\n\nPublishing a specification or component version is not exposed here. It marks every dependent stale and can route an approval, so it keeps one path through the app.\n\nPrivate projects are never visible on this API, whichever scopes a token holds.","contact":{"url":"/developers"}},"servers":[{"url":"/api/v1","description":"Same origin as the Prototype deployment"}],"tags":[{"name":"Meta"},{"name":"Projects"},{"name":"Documentation"},{"name":"Documents"},{"name":"Meetings"},{"name":"Tasks"},{"name":"Webhooks"}],"security":[{"bearerAuth":[]}],"paths":{"/me":{"get":{"tags":["Meta"],"summary":"Token and organisation","operationId":"getMe","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"organization":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"slug":{"type":"string"},"name":{"type":"string"}}},"scopes":{"type":"array","items":{"type":"string"}},"pluginId":{"type":["string","null"],"format":"uuid"}}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/projects":{"get":{"tags":["Projects"],"summary":"List projects","operationId":"listProjects","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/projects/{slug}":{"get":{"tags":["Projects"],"summary":"Get one project","operationId":"getProject","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ProjectDetail"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/projects/{slug}/specs":{"get":{"tags":["Projects"],"summary":"Published specs","operationId":"listSpecs","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Spec"}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/projects/{slug}/components":{"get":{"tags":["Projects"],"summary":"Components","operationId":"listComponents","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Component"}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/projects/{slug}/milestones":{"get":{"tags":["Projects"],"summary":"Milestones","operationId":"listMilestones","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Milestone"}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/projects/{slug}/tasks":{"post":{"tags":["Tasks"],"summary":"Create a task","description":"assigned_to takes a user id from this organisation, not a name.","operationId":"createTask","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"bearerAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/TaskPatch"},{"type":"object","required":["title"]}]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"}}}}}}}},"400":{"description":"Invalid body, or a refusal the caller can act on (no author behind the token, a body too large, an assignee outside the org)","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"get":{"tags":["Projects"],"summary":"Tasks","operationId":"listTasks","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Task"}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/projects/{slug}/pages":{"get":{"tags":["Documentation"],"summary":"List documentation pages","description":"The page tree, without bodies. Fetch one with GET /pages/{page_id}.","operationId":"listPages","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"bearerAuth":["pages:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/PageSummary"}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"post":{"tags":["Documentation"],"summary":"Create a documentation page","operationId":"createPage","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"bearerAuth":["pages:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string","maxLength":200},"markdown":{"type":"string","description":"Body as markdown. Headings and lists convert to rich text; tables and images do not."},"parent_page_id":{"type":"string","format":"uuid","description":"Nest under this page. Omit for top level."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}}}}}}}},"400":{"description":"Invalid body, or a refusal the caller can act on (no author behind the token, a body too large, an assignee outside the org)","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/pages/{page_id}":{"get":{"tags":["Documentation"],"summary":"Read a documentation page","description":"The body comes back as plain text, flattened from rich text.","operationId":"getPage","parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"security":[{"bearerAuth":["pages:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Page"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"patch":{"tags":["Documentation"],"summary":"Edit a documentation page","description":"Only the fields you send are touched. mode=replace discards the current body, so read the page first.","operationId":"updatePage","parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"security":[{"bearerAuth":["pages:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":200},"markdown":{"type":"string"},"mode":{"type":"string","enum":["replace","append"]}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid body, or a refusal the caller can act on (no author behind the token, a body too large, an assignee outside the org)","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/documents":{"get":{"tags":["Documents"],"summary":"List team-level documents","operationId":"listTeamDocuments","parameters":[{"name":"category","in":"query","required":false,"schema":{"type":"string","enum":["documentation","research"]}}],"security":[{"bearerAuth":["documents:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"post":{"tags":["Documents"],"summary":"Add a team-level document link","description":"Files a link. Uploading a file is not exposed here: it needs a signed upload, which stays in the app.","operationId":"addTeamDocumentLink","security":[{"bearerAuth":["documents:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentLinkInput"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"}}}}}}}},"400":{"description":"Invalid body, or a refusal the caller can act on (no author behind the token, a body too large, an assignee outside the org)","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/projects/{slug}/documents":{"get":{"tags":["Documents"],"summary":"List a project's documents","operationId":"listProjectDocuments","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"category","in":"query","required":false,"schema":{"type":"string","enum":["documentation","research"]}}],"security":[{"bearerAuth":["documents:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Document"}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}},"post":{"tags":["Documents"],"summary":"Add a document link to a project","operationId":"addProjectDocumentLink","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"bearerAuth":["documents:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentLinkInput"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"}}}}}}}},"400":{"description":"Invalid body, or a refusal the caller can act on (no author behind the token, a body too large, an assignee outside the org)","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/documents/{document_id}":{"patch":{"tags":["Documents"],"summary":"Edit a document entry","description":"Title and description only. The file or link target is not editable here.","operationId":"updateDocument","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"security":[{"bearerAuth":["documents:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":200},"description":{"type":["string","null"],"maxLength":2000}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"}}}}}}}},"400":{"description":"Invalid body, or a refusal the caller can act on (no author behind the token, a body too large, an assignee outside the org)","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/meetings":{"get":{"tags":["Meetings"],"summary":"List meetings","description":"Newest first. Meetings whose audience is restricted are filtered out.","operationId":"listMeetings","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date-time"}}],"security":[{"bearerAuth":["meetings:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/MeetingSummary"}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/projects/{slug}/meetings":{"get":{"tags":["Meetings"],"summary":"List a project's meetings","operationId":"listProjectMeetings","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"security":[{"bearerAuth":["meetings:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/MeetingSummary"}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/meetings/{meeting_id}":{"get":{"tags":["Meetings"],"summary":"Read a meeting","description":"Minutes as text, plus the state of the transcript and its notes.","operationId":"getMeeting","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"security":[{"bearerAuth":["meetings:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Meeting"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/meetings/{meeting_id}/transcript":{"get":{"tags":["Meetings"],"summary":"Read a meeting transcript","description":"Verbatim, and long. Truncated past 200000 characters.","operationId":"getMeetingTranscript","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"security":[{"bearerAuth":["meetings:read"]}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status":{"type":"string"},"text":{"type":"string"},"truncated":{"type":"boolean"}}}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/meetings/{meeting_id}/minutes":{"post":{"tags":["Meetings"],"summary":"Write meeting minutes","operationId":"writeMeetingMinutes","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"security":[{"bearerAuth":["meetings:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["markdown"],"properties":{"markdown":{"type":"string"},"mode":{"type":"string","enum":["replace","append"]}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"},"updatedAt":{"type":"string","format":"date-time"}}}}}}}},"400":{"description":"Invalid body, or a refusal the caller can act on (no author behind the token, a body too large, an assignee outside the org)","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/meetings/{meeting_id}/notes":{"post":{"tags":["Meetings"],"summary":"Write meeting notes","description":"Replaces the notes on a recorded meeting's transcript and marks them human-authored, so transcript jobs will not overwrite them. Requires a transcript to exist.","operationId":"writeMeetingNotes","parameters":[{"name":"meeting_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"security":[{"bearerAuth":["meetings:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["notes"],"properties":{"notes":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"transcriptId":{"type":"string"}}}}}}}},"400":{"description":"Invalid body, or a refusal the caller can act on (no author behind the token, a body too large, an assignee outside the org)","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/tasks/{task_id}":{"patch":{"tags":["Tasks"],"summary":"Update a task","description":"Only the fields you send are touched. Send null to clear a date or a blocked reason.","operationId":"updateTask","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"security":[{"bearerAuth":["tasks:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskPatch"}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"id":{"type":"string"}}}}}}}},"400":{"description":"Invalid body, or a refusal the caller can act on (no author behind the token, a body too large, an assignee outside the org)","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/webhooks/ping":{"post":{"tags":["Webhooks"],"summary":"Send a test delivery","operationId":"pingWebhook","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["webhook_id"],"properties":{"webhook_id":{"type":"string","format":"uuid"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","required":["ok","data"],"properties":{"ok":{"type":"boolean","enum":[true]},"data":{"type":"object","properties":{"status":{"type":"string"}}}}}}}},"400":{"description":"Invalid body or unknown webhook","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"401":{"description":"Missing, malformed, revoked, or expired token","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"403":{"description":"Token lacks the required scope","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}},"404":{"description":"Unknown route or slug not in this org","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"type":"boolean","enum":[false]},"error":{"type":"string"},"message":{"type":"string"}}}}}}}}},"/openapi.json":{"get":{"tags":["Meta"],"summary":"This document","operationId":"getOpenApi","security":[],"responses":{"200":{"description":"OpenAPI 3.1 document","content":{"application/json":{"schema":{"type":"object"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"ptk_live_"}},"schemas":{"PageSummary":{"type":"object","properties":{"id":{"type":"string"},"parentId":{"type":["string","null"]},"title":{"type":"string"},"position":{"type":"integer"},"updatedAt":{"type":"string","format":"date-time"}}},"Page":{"type":"object","properties":{"id":{"type":"string"},"parentId":{"type":["string","null"]},"title":{"type":"string"},"text":{"type":"string","description":"The body flattened to plain text."},"updatedAt":{"type":"string","format":"date-time"},"updatedBy":{"type":["string","null"]}}},"Document":{"type":"object","properties":{"id":{"type":"string"},"category":{"type":"string","enum":["documentation","research"]},"kind":{"type":"string","enum":["file","link"]},"title":{"type":"string"},"description":{"type":["string","null"]},"url":{"type":["string","null"]},"filename":{"type":["string","null"]},"byteSize":{"type":["integer","null"]},"contentType":{"type":["string","null"]},"uploadedBy":{"type":["string","null"]},"createdAt":{"type":"string","format":"date-time"}}},"DocumentLinkInput":{"type":"object","required":["title","url"],"properties":{"title":{"type":"string","maxLength":200},"url":{"type":"string","description":"Absolute http(s) URL."},"category":{"type":"string","enum":["documentation","research"],"default":"documentation"},"description":{"type":"string","maxLength":2000}}},"MeetingSummary":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":["string","null"]},"startsAt":{"type":"string","format":"date-time"},"durationMinutes":{"type":"integer"},"status":{"type":"string"},"locationType":{"type":"string"},"location":{"type":["string","null"]},"hasMinutes":{"type":"boolean"}}},"Meeting":{"allOf":[{"$ref":"#/components/schemas/MeetingSummary"},{"type":"object","properties":{"description":{"type":["string","null"]},"minutesText":{"type":"string"},"minutesUpdatedAt":{"type":["string","null"]},"transcript":{"type":["object","null"],"properties":{"id":{"type":"string"},"status":{"type":"string"},"notes":{"type":["string","null"]},"notesStatus":{"type":"string"},"notesSource":{"type":["string","null"]},"hasFullText":{"type":"boolean"}}}}}]},"TaskPatch":{"type":"object","properties":{"title":{"type":"string","minLength":2,"maxLength":200},"description":{"type":["string","null"],"maxLength":4000},"status":{"type":"string","enum":["not_started","in_progress","blocked","done","cancelled"]},"priority":{"type":"string","enum":["low","normal","high","critical"]},"start_date":{"type":["string","null"],"format":"date"},"due_date":{"type":["string","null"],"format":"date"},"blocked_reason":{"type":["string","null"],"maxLength":500},"assigned_to":{"type":["string","null"]}}},"Project":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"visibility":{"type":"string"},"description":{"type":["string","null"]},"startDate":{"type":["string","null"]},"targetDate":{"type":["string","null"]}}},"ProjectDetail":{"allOf":[{"$ref":"#/components/schemas/Project"},{"type":"object","properties":{"id":{"type":"string","format":"uuid"}}}]},"Spec":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"kind":{"type":["string","null"]},"units":{"type":["string","null"]},"valueType":{"type":["string","null"]},"latest":{"type":["object","null"],"properties":{"version":{"type":"string"},"status":{"type":"string"},"value":{},"publishedAt":{"type":["string","null"],"format":"date-time"}}}}},"Component":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"kind":{"type":["string","null"]},"latest":{"type":["object","null"],"properties":{"version":{"type":"string"},"status":{"type":"string"},"lifecycleStage":{"type":"string"},"healthStatus":{"type":"string"}}}}},"Milestone":{"type":"object","properties":{"name":{"type":"string"},"kind":{"type":"string"},"status":{"type":"string"},"targetDate":{"type":"string"},"actualDate":{"type":["string","null"]},"description":{"type":["string","null"]}}},"Task":{"type":"object","properties":{"title":{"type":"string"},"status":{"type":"string"},"priority":{"type":"string"},"targetDate":{"type":["string","null"]},"description":{"type":["string","null"]}}}}}}