{"openapi":"3.1.0","info":{"title":"Luuphub Public API","version":"1.0.0","description":"Scoped, key-authenticated REST access to sites, boards, posts, comments, votes, statuses and changelog. All mutations honour the `Idempotency-Key` header. Keys carry scopes and an optional single-site restriction."},"servers":[{"url":"https://luuphub.com"}],"tags":[{"name":"sites"},{"name":"boards"},{"name":"posts"},{"name":"comments"},{"name":"votes"},{"name":"statuses"},{"name":"changelog"},{"name":"search"},{"name":"insights"},{"name":"automation"}],"security":[{"bearerAuth":[]}],"paths":{"/v1/sites":{"get":{"operationId":"listSites","summary":"List sites","tags":["sites"],"security":[{"bearerAuth":[]}],"description":"List sites. Requires the `sites:read` scope on the API key.","responses":{"200":{"description":"The accessible sites","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Site"}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["data","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}":{"get":{"operationId":"getSite","summary":"Get a site","tags":["sites"],"security":[{"bearerAuth":[]}],"description":"Get a site. Requires the `sites:read` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."}],"responses":{"200":{"description":"The site","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Site"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/boards":{"get":{"operationId":"listBoards","summary":"List boards","tags":["boards"],"security":[{"bearerAuth":[]}],"description":"List boards. Requires the `boards:read` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."}],"responses":{"200":{"description":"The boards","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Board"}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["data","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"createBoard","summary":"Create a board","tags":["boards"],"security":[{"bearerAuth":[]}],"description":"Create a board. Requires the `boards:write` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBoardBody"}}}},"responses":{"201":{"description":"The created board","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Board"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/posts":{"get":{"operationId":"listPosts","summary":"List posts","tags":["posts"],"security":[{"bearerAuth":[]}],"description":"List posts. Requires the `posts:read` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."},{"in":"query","name":"limit","schema":{"description":"Page size (1–100, default 50).","type":"integer","minimum":1,"maximum":100},"description":"Page size (1–100, default 50)."},{"in":"query","name":"cursor","schema":{"description":"Opaque pagination cursor from a prior response.","type":"string"},"description":"Opaque pagination cursor from a prior response."},{"in":"query","name":"boardId","schema":{"type":"string"}}],"responses":{"200":{"description":"The posts","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Post"}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["data","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"createPost","summary":"Create a post","tags":["posts"],"security":[{"bearerAuth":[]}],"description":"Create a post. Requires the `posts:write` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePostBody"}}}},"responses":{"201":{"description":"The created post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/posts/{postId}":{"get":{"operationId":"getPost","summary":"Get a post","tags":["posts"],"security":[{"bearerAuth":[]}],"description":"Get a post. Requires the `posts:read` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."},{"in":"path","name":"postId","schema":{"type":"string","minLength":1,"description":"A post id.","example":"post_abc123"},"required":true,"description":"A post id."}],"responses":{"200":{"description":"The post","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Post"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/posts/{postId}/status":{"put":{"operationId":"changePostStatus","summary":"Change a post status","tags":["posts","statuses"],"security":[{"bearerAuth":[]}],"description":"Change a post status. Requires the `statuses:write` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."},{"in":"path","name":"postId","schema":{"type":"string","minLength":1,"description":"A post id.","example":"post_abc123"},"required":true,"description":"A post id."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePostStatusBody"}}}},"responses":{"200":{"description":"The status transition","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePostStatusResult"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/posts/{postId}/merge":{"post":{"operationId":"mergePosts","summary":"Merge a duplicate post into a survivor","tags":["posts"],"security":[{"bearerAuth":[]}],"description":"Merge a duplicate post into a survivor. Requires the `posts:write` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."},{"in":"path","name":"postId","schema":{"type":"string","minLength":1,"description":"A post id.","example":"post_abc123"},"required":true,"description":"A post id."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergePostsBody"}}}},"responses":{"200":{"description":"The merge outcome","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MergeResult"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/posts/{postId}/comments":{"get":{"operationId":"listComments","summary":"List a post comments","tags":["comments"],"security":[{"bearerAuth":[]}],"description":"List a post comments. Requires the `comments:read` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."},{"in":"path","name":"postId","schema":{"type":"string","minLength":1,"description":"A post id.","example":"post_abc123"},"required":true,"description":"A post id."}],"responses":{"200":{"description":"The comments","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["data","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"createComment","summary":"Comment on a post","tags":["comments"],"security":[{"bearerAuth":[]}],"description":"Comment on a post. Requires the `comments:write` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."},{"in":"path","name":"postId","schema":{"type":"string","minLength":1,"description":"A post id.","example":"post_abc123"},"required":true,"description":"A post id."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCommentBody"}}}},"responses":{"201":{"description":"The created comment","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Comment"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/posts/{postId}/votes":{"post":{"operationId":"createVote","summary":"Vote on a post","tags":["votes"],"security":[{"bearerAuth":[]}],"description":"Vote on a post. Requires the `votes:write` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."},{"in":"path","name":"postId","schema":{"type":"string","minLength":1,"description":"A post id.","example":"post_abc123"},"required":true,"description":"A post id."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVoteBody"}}}},"responses":{"201":{"description":"The vote result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteResult"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/statuses":{"get":{"operationId":"listStatuses","summary":"List statuses","tags":["statuses"],"security":[{"bearerAuth":[]}],"description":"List statuses. Requires the `statuses:read` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."}],"responses":{"200":{"description":"The statuses","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Status"}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["data","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"createStatus","summary":"Create a status","tags":["statuses"],"security":[{"bearerAuth":[]}],"description":"Create a status. Requires the `statuses:write` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStatusBody"}}}},"responses":{"201":{"description":"The created status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Status"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/changelog":{"get":{"operationId":"listChangelog","summary":"List changelog entries","tags":["changelog"],"security":[{"bearerAuth":[]}],"description":"List changelog entries. Requires the `changelog:read` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."}],"responses":{"200":{"description":"The changelog entries","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ChangelogEntry"}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["data","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/search":{"get":{"operationId":"searchPosts","summary":"Search posts","tags":["search"],"security":[{"bearerAuth":[]}],"description":"Search posts. Requires the `search:read` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."},{"in":"query","name":"limit","schema":{"description":"Page size (1–100, default 50).","type":"integer","minimum":1,"maximum":100},"description":"Page size (1–100, default 50)."},{"in":"query","name":"cursor","schema":{"description":"Opaque pagination cursor from a prior response.","type":"string"},"description":"Opaque pagination cursor from a prior response."},{"in":"query","name":"q","schema":{"type":"string","minLength":1,"description":"The search query."},"required":true,"description":"The search query."}],"responses":{"200":{"description":"The matching posts","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/SearchResult"}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque cursor for the next page, or null when exhausted."}},"required":["data","nextCursor"],"additionalProperties":false}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/sites/{siteId}/insights":{"get":{"operationId":"getInsights","summary":"Get a site AI-clustered feedback themes","tags":["insights"],"security":[{"bearerAuth":[]}],"description":"Get a site AI-clustered feedback themes. Requires the `insights:read` scope on the API key.","parameters":[{"in":"path","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."}],"responses":{"200":{"description":"The latest clustered themes for the site","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InsightsSummary"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/automation/queue":{"get":{"operationId":"getAutopilotQueue","summary":"List the autopilot queue for a site","tags":["automation"],"security":[{"bearerAuth":[]}],"description":"List the autopilot queue for a site. Requires the `automation:read` scope on the API key.","parameters":[{"in":"query","name":"siteId","schema":{"type":"string","minLength":1,"description":"The site id the request targets.","example":"site_abc123"},"required":true,"description":"The site id the request targets."}],"responses":{"200":{"description":"The autopilot queue (highest-voted open requests)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutopilotQueue"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/automation/runs":{"post":{"operationId":"startAgentRun","summary":"Start an agent run","tags":["automation"],"security":[{"bearerAuth":[]}],"description":"Start an agent run. Requires the `automation:write` scope on the API key.","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartAgentRunBody"}}}},"responses":{"201":{"description":"The started run","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentRunDto"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/automation/runs/{runId}/steps":{"post":{"operationId":"appendAgentRunStep","summary":"Append a step to an agent run","tags":["automation"],"security":[{"bearerAuth":[]}],"description":"Append a step to an agent run. Requires the `automation:write` scope on the API key.","parameters":[{"in":"path","name":"runId","schema":{"type":"string","minLength":1,"description":"An agent-run id."},"required":true,"description":"An agent-run id."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppendRunStepBody"}}}},"responses":{"201":{"description":"The appended step","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentRunStepDto"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/automation/runs/{runId}/complete":{"post":{"operationId":"completeAgentRun","summary":"Complete an agent run","tags":["automation"],"security":[{"bearerAuth":[]}],"description":"Complete an agent run. Requires the `automation:write` scope on the API key.","parameters":[{"in":"path","name":"runId","schema":{"type":"string","minLength":1,"description":"An agent-run id."},"required":true,"description":"An agent-run id."}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteAgentRunBody"}}}},"responses":{"200":{"description":"The completed run","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentRunDto"}}}},"400":{"description":"Invalid request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"The account plan does not include API access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"The key lacks the scope or site access","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A request with this idempotency key is still processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Unprocessable entity (idempotency key reused with a different body, or a validation error)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"schemas":{"CreateBoardBody":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","maxLength":2000},"private":{"type":"boolean"},"slug":{"type":"string","maxLength":60,"pattern":"^[a-z0-9-]+$"}},"required":["name"]},"CreatePostBody":{"type":"object","properties":{"boardId":{"type":"string","minLength":1},"title":{"type":"string","minLength":1,"maxLength":200},"body":{"type":"string","maxLength":20000},"onBehalfVisitorId":{"type":"string","minLength":1,"description":"The visitor the feedback is logged for (authoritative author)."}},"required":["boardId","title","onBehalfVisitorId"]},"ChangePostStatusBody":{"type":"object","properties":{"statusId":{"anyOf":[{"type":"string"},{"type":"null"}]},"note":{"description":"Required when the target status uses NOTIFY_WITH_NOTE.","type":"string","maxLength":2000}},"required":["statusId"]},"MergePostsBody":{"type":"object","properties":{"winnerId":{"type":"string","minLength":1,"description":"The surviving post id. The path post is folded into it."}},"required":["winnerId"]},"CreateCommentBody":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":10000},"parentId":{"type":"string"},"internal":{"description":"Internal admin-only comment (hidden from the public portal).","type":"boolean"}},"required":["body"]},"CreateVoteBody":{"type":"object","properties":{"onBehalfVisitorId":{"type":"string","minLength":1,"description":"The visitor the vote is cast for (counts once, insert-only)."}},"required":["onBehalfVisitorId"]},"CreateStatusBody":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":40},"color":{"type":"string","pattern":"^#[0-9a-fA-F]{6}$"},"doneFlag":{"type":"boolean"},"showOnRoadmap":{"type":"boolean"},"notifyMode":{"type":"string","enum":["NOTIFY","SILENT","NOTIFY_WITH_NOTE"]}},"required":["name"]},"StartAgentRunBody":{"type":"object","properties":{"siteId":{"type":"string","minLength":1},"agentKind":{"type":"string","enum":["CLAUDE","CODEX","CURSOR"]},"postId":{"type":"string","minLength":1},"repo":{"type":"string","minLength":1},"mode":{"type":"string","enum":["AUTOPILOT","MANUAL"]},"title":{"type":"string","minLength":1,"maxLength":300}},"required":["siteId","agentKind"]},"AppendRunStepBody":{"type":"object","properties":{"tone":{"type":"string","enum":["DONE","BUILDING","CLOSED","FAILED"]},"label":{"type":"string","minLength":1,"maxLength":300},"detail":{"type":"string"},"code":{"type":"string"},"labelMeta":{"type":"string"},"at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"ciResult":{"type":"string","enum":["NONE","PENDING","GREEN","RED"]},"prUrl":{"type":"string","format":"uri"},"prNumber":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"repo":{"type":"string"}},"required":["tone","label"]},"CompleteAgentRunBody":{"type":"object","properties":{"outcome":{"type":"string","enum":["SHIPPED","NEEDS_REVIEW","BLOCKED","FAILED"]},"changelogEntryId":{"type":"string","minLength":1},"doneStatusId":{"type":"string","minLength":1}},"required":["outcome"]},"Site":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"createdAt":{"type":"string","description":"ISO-8601 timestamp."}},"required":["id","name","slug","createdAt"],"additionalProperties":false,"description":"A feedback site (portal + boards)."},"ErrorResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"SCOPE_REQUIRED"},"message":{"type":"string","example":"this key is missing the required scope"},"details":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["code","message"],"additionalProperties":false}},"required":["error"],"additionalProperties":false,"description":"A typed API error."},"Board":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"},"description":{"anyOf":[{"type":"string"},{"type":"null"}]},"private":{"type":"boolean"},"postCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","name","slug","description","private","postCount"],"additionalProperties":false,"description":"A board that groups posts within a site."},"Post":{"type":"object","properties":{"id":{"type":"string"},"siteId":{"type":"string"},"boardId":{"type":"string"},"boardName":{"type":"string"},"title":{"type":"string"},"statusName":{"anyOf":[{"type":"string"},{"type":"null"}]},"voteCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"pinned":{"type":"boolean"},"archived":{"type":"boolean"},"locked":{"type":"boolean"},"tags":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"}},"required":["id","name","color"],"additionalProperties":false}},"createdAt":{"type":"string"}},"required":["id","siteId","boardId","boardName","title","statusName","voteCount","pinned","archived","locked","tags","createdAt"],"additionalProperties":false,"description":"A feedback post (idea/bug)."},"ChangePostStatusResult":{"type":"object","properties":{"postId":{"type":"string"},"fromStatusId":{"anyOf":[{"type":"string"},{"type":"null"}]},"toStatusId":{"anyOf":[{"type":"string"},{"type":"null"}]},"enteredDoneState":{"type":"boolean"}},"required":["postId","fromStatusId","toStatusId","enteredDoneState"],"additionalProperties":false},"MergeResult":{"type":"object","properties":{"ok":{"type":"boolean"},"loserId":{"type":"string"},"winnerId":{"type":"string"},"actionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The AiAction id recording the merge (undo target), or null when rejected."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Rejection reason when `ok` is false."}},"required":["ok","loserId","winnerId","actionId","reason"],"additionalProperties":false},"Comment":{"type":"object","properties":{"id":{"type":"string"},"postId":{"type":"string"},"parentId":{"anyOf":[{"type":"string"},{"type":"null"}]},"body":{"type":"string"},"authorType":{"type":"string","enum":["visitor","member"]},"internal":{"type":"boolean"},"createdAt":{"type":"string"}},"required":["id","postId","parentId","body","authorType","internal","createdAt"],"additionalProperties":false,"description":"A comment on a post."},"VoteResult":{"type":"object","properties":{"postId":{"type":"string"},"visitorId":{"type":"string"},"created":{"type":"boolean","description":"False when the vote already existed."},"voteCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["postId","visitorId","created","voteCount"],"additionalProperties":false},"Status":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"color":{"type":"string"},"order":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"doneFlag":{"type":"boolean"},"showOnRoadmap":{"type":"boolean"},"isDefault":{"type":"boolean"}},"required":["id","name","color","order","doneFlag","showOnRoadmap","isDefault"],"additionalProperties":false,"description":"A workflow status a post can hold."},"ChangelogEntry":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"slug":{"type":"string"},"body":{"type":"string"},"label":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string"},"publishedAt":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string"}},"required":["id","title","slug","body","label","status","publishedAt","createdAt"],"additionalProperties":false,"description":"A published or draft changelog entry."},"SearchResult":{"type":"object","properties":{"postId":{"type":"string"},"siteId":{"type":"string"},"title":{"type":"string"},"boardName":{"type":"string"},"statusName":{"anyOf":[{"type":"string"},{"type":"null"}]},"voteCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["postId","siteId","title","boardName","statusName","voteCount"],"additionalProperties":false},"InsightsSummary":{"type":"object","properties":{"hasInsights":{"type":"boolean"},"lastRunAt":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ISO-8601 timestamp of the latest run, or null."},"quotaPaused":{"type":"boolean","description":"True when the latest run stopped on the AI quota."},"themes":{"type":"array","items":{"$ref":"#/components/schemas/InsightTheme"}}},"required":["hasInsights","lastRunAt","quotaPaused","themes"],"additionalProperties":false,"description":"A site's latest AI-clustered feedback themes."},"InsightTheme":{"type":"object","properties":{"clusterId":{"type":"string"},"siteId":{"type":"string"},"label":{"type":"string"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}]},"sentiment":{"anyOf":[{"type":"string","enum":["positive","neutral","negative"]},{"type":"null"}]},"postCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"trend":{"type":"string","enum":["up","down","flat","new"]},"trendDelta":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["clusterId","siteId","label","summary","sentiment","postCount","trend","trendDelta"],"additionalProperties":false,"description":"One clustered feedback theme for a site."},"AutopilotQueue":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"runId":{"type":"string"},"title":{"type":"string"},"stage":{"type":"string","enum":["shipped","pr_open","building","queued","needs_review"]},"votes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","title","stage","votes"],"additionalProperties":false}}},"required":["items"],"additionalProperties":false},"AgentRunDto":{"type":"object","properties":{"id":{"type":"string"},"runNumber":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"title":{"type":"string"},"agentKind":{"type":"string","enum":["CLAUDE","CODEX","CURSOR"]},"status":{"type":"string","enum":["QUEUED","RUNNING","NEEDS_REVIEW","BLOCKED","SHIPPED","FAILED"]},"ciResult":{"type":"string","enum":["NONE","PENDING","GREEN","RED"]},"repo":{"anyOf":[{"type":"string"},{"type":"null"}]},"prUrl":{"anyOf":[{"type":"string"},{"type":"null"}]},"notifiedCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["id","runNumber","title","agentKind","status","ciResult","repo","prUrl","notifiedCount"],"additionalProperties":false},"AgentRunStepDto":{"type":"object","properties":{"id":{"type":"string"},"runId":{"type":"string"},"seq":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"tone":{"type":"string","enum":["DONE","BUILDING","CLOSED","FAILED"]},"label":{"type":"string"}},"required":["id","runId","seq","tone","label"],"additionalProperties":false}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A Luuphub API key (`lh_live_…`), sent as `Authorization: Bearer <key>`. The listed scopes are required for the operation."}}}}