support-tickets
6 endpoints.
/api/support-tickets/attachment-uploads Bearer tokenRequest an upload URL for a support ticket screenshot
Issues a presigned URL to PUT one screenshot — PNG, JPEG, WebP or GIF, at most 10 MB — straight to private file storage, before the report or reply that carries it exists. Pass the pathname back in that report's or reply's `attachments`; only the account it was issued to can attach it. Any signed-in account may upload.
| Field | Type | Required | Description |
|---|---|---|---|
| file_name | string | yes | 1–255 characters |
| content_type | string | yes | The image type the file will be PUT with. one of "image/png" | "image/jpeg" | "image/webp" | "image/gif" |
| size_bytes | integer | yes | The file's exact size, at most 10 MB. minimum 1 · maximum 10485760 |
Responses
| Status | Description | Body |
|---|---|---|
| 201 | Where to PUT the file, and the attachment id minted for it. | SupportTicketUploadTicket |
| 400 | The request body failed validation. | ErrorResponse |
| 401 | The access token is missing or invalid. | ErrorResponse |
| 500 | The upload URL could not be signed. | ErrorResponse |
| 503 | File storage is not configured on this deployment. | ErrorResponse |
/api/support-tickets Bearer tokenList support tickets
Lists the support tickets the caller may read, latest activity first, a page at a time: every ticket for a superuser, the caller's own reports for anyone else. `mine=true` narrows a superuser to their own reports too.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| status | query | string | no | Only tickets in this state. |
| category | query | string | no | Only tickets of this category. |
| mine | query | string | no | Only the caller's own reports. Always the case for a non-superuser. |
| q | query | string | no | Search words; each must match the description, the page, the reporter's name or email, or the ticket number (42 or #42). |
| cursor | query | string | no | Opaque cursor from a previous page's next_cursor. |
| limit | query | integer | no | Page size, 1-200. Defaults to 50. |
Responses
| Status | Description | Body |
|---|---|---|
| 200 | One page of tickets. | SupportTicketList |
| 400 | A query parameter or the cursor is invalid. | ErrorResponse |
| 401 | The access token is missing or invalid. | ErrorResponse |
| 500 | The database could not be read. | ErrorResponse |
/api/support-tickets Bearer tokenReport a problem
Opens a support ticket: a category, a plain-text description, the app page it is about, and up to six screenshots uploaded first through the uploads endpoint. The browser it came from is read off the request. The deployment's superusers are told in their inbox. Any signed-in account may report.
| Field | Type | Required | Description |
|---|---|---|---|
| category | string | yes | one of "bug" | "content_issue" | "permissions_error" | "account" | "suggestion" | "other" |
| description | string | yes | What went wrong, in plain text. 1–5000 characters |
| page_path | string | no | The app path (and query) the problem is on; never an origin. at most 2000 characters · matches ^\/(?!\/) |
| page_title | string | no | 1–300 characters |
| attachments | array of SupportTicketAttachmentInput | no | Screenshots uploaded through the uploads endpoint, at most 6. at most 6 items |
Responses
| Status | Description | Body |
|---|---|---|
| 201 | The new ticket. | SupportTicket |
| 400 | The request body failed validation, or a screenshot is missing from storage or not the one the request describes. | ErrorResponse |
| 401 | The access token is missing or invalid. | ErrorResponse |
| 409 | A screenshot is already attached to another ticket. | ErrorResponse |
| 500 | The database could not be reached, or the write failed. | ErrorResponse |
| 503 | Screenshots were named, but file storage is not configured on this deployment. | ErrorResponse |
/api/support-tickets/{ticket_id} Bearer tokenRead a support ticket
One support ticket with its screenshots — each with presigned URLs good for an hour — and its conversation, oldest first. Its reporter and superusers may read it; to anyone else it answers as though it did not exist.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| ticket_id | path | string (uuid) | yes | UUID id of the support ticket. |
Responses
| Status | Description | Body |
|---|---|---|
| 200 | The ticket. | SupportTicket |
| 401 | The access token is missing or invalid. | ErrorResponse |
| 404 | No ticket the caller may read has that id. | ErrorResponse |
| 500 | The database could not be read. | ErrorResponse |
/api/support-tickets/{ticket_id} Bearer tokenChange a support ticket's status
Moves a ticket to open, in progress or resolved. The change shows in its conversation and its reporter is told. Superusers only; moving it to the status it already has changes nothing.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| ticket_id | path | string (uuid) | yes | UUID id of the support ticket. |
| Field | Type | Required | Description |
|---|---|---|---|
| status | string | yes | Where the ticket now stands. The change shows in its conversation. one of "open" | "in_progress" | "resolved" |
Responses
| Status | Description | Body |
|---|---|---|
| 200 | The ticket, as it now stands. | SupportTicket |
| 400 | The request body failed validation. | ErrorResponse |
| 401 | The access token is missing or invalid. | ErrorResponse |
| 403 | The caller reported the ticket but is not a superuser. | ErrorResponse |
| 404 | No ticket the caller may read has that id. | ErrorResponse |
| 500 | The database could not be reached, or the write failed. | ErrorResponse |
/api/support-tickets/{ticket_id}/messages Bearer tokenReply on a support ticket
Adds a plain-text reply to a ticket's conversation, with up to six screenshots uploaded first through the uploads endpoint. Its reporter and superusers may reply. A superuser may also move the ticket to a new status with the reply (`status`), or on its own; a reporter's reply reopens a resolved ticket. The other side of the conversation is told in their inbox.
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
| ticket_id | path | string (uuid) | yes | UUID id of the support ticket. |
| Field | Type | Required | Description |
|---|---|---|---|
| body | string | no | The reply, in plain text. 1–5000 characters |
| status | string | no | Support staff only: the status to move the ticket to with the reply, such as replying and resolving at once. A reporter's reply reopens a resolved ticket by itself. one of "open" | "in_progress" | "resolved" |
| attachments | array of SupportTicketAttachmentInput | no | Screenshots uploaded through the uploads endpoint, at most 6. at most 6 items |
Responses
| Status | Description | Body |
|---|---|---|
| 201 | The ticket, with the new message in its conversation. | SupportTicket |
| 400 | The request body failed validation, or a screenshot is missing from storage or not the one the request describes. | ErrorResponse |
| 401 | The access token is missing or invalid. | ErrorResponse |
| 403 | The caller sent a status but is not a superuser. | ErrorResponse |
| 404 | No ticket the caller may read has that id. | ErrorResponse |
| 409 | A screenshot is already attached to another ticket. | ErrorResponse |
| 500 | The database could not be reached, or the write failed. | ErrorResponse |
| 503 | Screenshots were named, but file storage is not configured on this deployment. | ErrorResponse |