{"components":{"securitySchemes":{"reporterKey":{"in":"header","name":"x-api-key","type":"apiKey"}}},"info":{"title":"Glink external reporter API","version":"1.0.0"},"openapi":"3.0.3","paths":{"/changelogs":{"get":{"description":"Requires bugReporter:read. Project-scoped published public changelogs, newest first. No email required. Drafts, future publications and deleted/private changelogs are excluded.","operationId":"listExternalChangelogs","security":[{"reporterKey":[]}],"summary":"listExternalChangelogs","tags":["External reporter"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"changes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"tag":{"type":"string"},"title":{"type":"string"}},"required":["id","tag","title"]}},"entries":{"type":"array","items":{"type":"object","properties":{"content":{"type":"string"},"emoji":{"nullable":true,"type":"string"},"id":{"type":"string"},"media":{"type":"array","items":{"type":"object","properties":{"mimeType":{"type":"string"},"url":{"type":"string"}},"required":["mimeType","url"]}}},"required":["content","emoji","id","media"]}},"id":{"type":"string"},"publishedAt":{"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))$"},"slug":{"type":"string"},"title":{"type":"string"},"url":{"type":"string"},"version":{"nullable":true,"type":"string"}},"required":["changes","entries","id","publishedAt","slug","title","url","version"]}}}},"description":"Success (Cache-Control: private, no-store)"},"400":{"description":"Invalid payload"},"401":{"description":"Missing/invalid key or insufficient permission"},"404":{"description":"Resource not found in this project/email scope"},"500":{"description":"Internal error"}},"parameters":[{"in":"query","name":"limit","schema":{"default":20,"maximum":100,"minimum":1,"type":"integer"}}]}},"/requests":{"get":{"description":"Requires bugReporter:read. Backend-only; email must be verified by the consuming app.","operationId":"listExternalRequests","security":[{"reporterKey":[]}],"summary":"listExternalRequests","tags":["External reporter"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"category":{"nullable":true,"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"closed":{"type":"boolean"},"commentCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"contentPreview":{"type":"string"},"createdAt":{"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))$"},"id":{"type":"string"},"lastCommentAt":{"nullable":true,"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))$"},"lastCommentByOwner":{"type":"boolean"},"public":{"type":"boolean"},"title":{"type":"string"},"updatedAt":{"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))$"}},"required":["category","closed","commentCount","contentPreview","createdAt","id","lastCommentAt","lastCommentByOwner","public","title","updatedAt"]}}}},"description":"Success (Cache-Control: private, no-store)"},"400":{"description":"Invalid payload"},"401":{"description":"Missing/invalid key or insufficient permission"},"404":{"description":"Resource not found in this project/email scope"},"500":{"description":"Internal error"}},"parameters":[{"in":"query","name":"email","required":true,"schema":{"format":"email","type":"string"}},{"in":"query","name":"status","schema":{"default":"all","enum":["open","closed","all"],"type":"string"}}]},"post":{"description":"Requires bugReporter:submit. Backend-only; email must be verified by the consuming app.","operationId":"createExternalRequest","security":[{"reporterKey":[]}],"summary":"createExternalRequest","tags":["External reporter"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"categoryId":{"type":"string"},"content":{"type":"string","minLength":1},"imageIds":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1}},"title":{"type":"string","minLength":1},"guestEmail":{"type":"string","maxLength":320,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"meta":{"type":"object","additionalProperties":{}}},"required":["content","title","guestEmail"]}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"approved":{"type":"boolean"},"category":{"nullable":true,"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"closed":{"type":"boolean"},"content":{"type":"string"},"createdAt":{"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))$"},"deletedAt":{"nullable":true,"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))$"},"id":{"type":"string"},"locked":{"type":"boolean"},"projectId":{"type":"string"},"public":{"type":"boolean"},"requestCategoryId":{"nullable":true,"type":"string"},"roadmapEntryId":{"nullable":true,"type":"string"},"title":{"type":"string"},"updatedAt":{"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))$"}},"required":["approved","category","closed","content","createdAt","deletedAt","id","locked","projectId","public","requestCategoryId","roadmapEntryId","title","updatedAt"]}}},"description":"Success (Cache-Control: private, no-store)"},"400":{"description":"Invalid payload"},"401":{"description":"Missing/invalid key or insufficient permission"},"404":{"description":"Resource not found in this project/email scope"},"500":{"description":"Internal error"}}}},"/requests/{id}":{"get":{"description":"Requires bugReporter:read. Backend-only; email must be verified by the consuming app.","operationId":"getExternalRequest","security":[{"reporterKey":[]}],"summary":"getExternalRequest","tags":["External reporter"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"category":{"nullable":true,"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"]},"closed":{"type":"boolean"},"comments":{"type":"array","items":{"type":"object","properties":{"author":{"type":"object","properties":{"avatarUrl":{"type":"string"},"kind":{"type":"string","enum":["guest","owner","user"]},"name":{"type":"string"}},"required":["kind"]},"createdAt":{"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))$"},"id":{"type":"string"},"images":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"mimeType":{"type":"string"},"url":{"type":"string"}},"required":["id","mimeType","url"]}},"text":{"type":"string"}},"required":["author","createdAt","id","images","text"]}},"content":{"type":"string"},"createdAt":{"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))$"},"id":{"type":"string"},"images":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"mimeType":{"type":"string"},"url":{"type":"string"}},"required":["id","mimeType","url"]}},"public":{"type":"boolean"},"title":{"type":"string"}},"required":["category","closed","comments","content","createdAt","id","images","public","title"]}}},"description":"Success (Cache-Control: private, no-store)"},"400":{"description":"Invalid payload"},"401":{"description":"Missing/invalid key or insufficient permission"},"404":{"description":"Resource not found in this project/email scope"},"500":{"description":"Internal error"}},"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}},{"in":"query","name":"email","required":true,"schema":{"format":"email","type":"string"}}]}},"/requests/{id}/close":{"post":{"description":"Requires bugReporter:comment. Backend-only; email must be verified by the consuming app.","operationId":"closeExternalRequest","security":[{"reporterKey":[]}],"summary":"closeExternalRequest","tags":["External reporter"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["email"]}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"closed":{"type":"boolean"},"id":{"type":"string"}},"required":["closed","id"]}}},"description":"Success (Cache-Control: private, no-store)"},"400":{"description":"Invalid payload"},"401":{"description":"Missing/invalid key or insufficient permission"},"404":{"description":"Resource not found in this project/email scope"},"500":{"description":"Internal error"}},"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/requests/{id}/comments":{"post":{"description":"Requires bugReporter:comment. Backend-only; email must be verified by the consuming app.","operationId":"commentExternalRequest","security":[{"reporterKey":[]}],"summary":"commentExternalRequest","tags":["External reporter"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"imageIds":{"maxItems":20,"type":"array","items":{"type":"string","minLength":1}},"text":{"type":"string","minLength":1,"maxLength":50000}},"required":["email","text"]}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"type":"object","properties":{"author":{"type":"object","properties":{"avatarUrl":{"type":"string"},"kind":{"type":"string","enum":["guest","owner","user"]},"name":{"type":"string"}},"required":["kind"]},"createdAt":{"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))$"},"id":{"type":"string"},"images":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"mimeType":{"type":"string"},"url":{"type":"string"}},"required":["id","mimeType","url"]}},"text":{"type":"string"}},"required":["author","createdAt","id","images","text"]}}},"description":"Success (Cache-Control: private, no-store)"},"400":{"description":"Invalid payload"},"401":{"description":"Missing/invalid key or insufficient permission"},"404":{"description":"Resource not found in this project/email scope"},"500":{"description":"Internal error"}},"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/requests/{id}/reopen":{"post":{"description":"Requires bugReporter:comment. Backend-only; email must be verified by the consuming app.","operationId":"reopenExternalRequest","security":[{"reporterKey":[]}],"summary":"reopenExternalRequest","tags":["External reporter"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"}},"required":["email"]}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"closed":{"type":"boolean"},"id":{"type":"string"}},"required":["closed","id"]}}},"description":"Success (Cache-Control: private, no-store)"},"400":{"description":"Invalid payload"},"401":{"description":"Missing/invalid key or insufficient permission"},"404":{"description":"Resource not found in this project/email scope"},"500":{"description":"Internal error"}},"parameters":[{"in":"path","name":"id","required":true,"schema":{"type":"string"}}]}},"/uploads":{"post":{"description":"Requires bugReporter:upload. Backend-only; email must be verified by the consuming app.","operationId":"uploadExternalFile","security":[{"reporterKey":[]}],"summary":"uploadExternalFile","tags":["External reporter"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":320,"format":"email","pattern":"^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"fileName":{"type":"string","minLength":1,"maxLength":255},"fileSize":{"type":"integer","minimum":0,"exclusiveMinimum":true,"maximum":104857600},"fileType":{"type":"string","enum":["image/png","image/jpeg","image/gif","image/webp","image/avif","video/mp4","video/webm","video/quicktime"]}},"required":["email","fileName","fileSize","fileType"]}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"imageId":{"type":"string"},"publicUrl":{"type":"string"},"uploadUrl":{"type":"string"}},"required":["imageId","publicUrl","uploadUrl"]}}},"description":"Success (Cache-Control: private, no-store)"},"400":{"description":"Invalid payload"},"401":{"description":"Missing/invalid key or insufficient permission"},"404":{"description":"Resource not found in this project/email scope"},"500":{"description":"Internal error"}}}}},"servers":[{"url":"https://glink.so/api/external"}]}