Stream an attachment's bytes (session-checked)
Streams the file itself to an authenticated caller who can read the issue it hangs off — the attachment's issue, or the issue its comment sits on: the caller's active workspace, then a team they may read (EAS-267). The web editor loads images through this route into blob: URLs, so no URL that opens a file on its own has to leave the service. Everything out of reach is a 404, never a 403 — another workspace, another team's file, a deleted attachment, an orphan whose parent is gone — so the response never confirms that an id names a real file. Inline (with the stored image type) only for verified raster images; every other file is served as a download under its own filename. The response is `private, no-store`, `no-referrer`, `nosniff`, and carries `Content-Security-Policy: default-src 'none'; sandbox`. Streams are bounded: a deadline per stream sized to the file (30 s plus one second per 128 KiB), at most 12 concurrent streams per caller and 128 overall. A request past a cap waits up to 10 seconds for a slot, then gets 429 with Retry-After. 501 when storage is not configured; 502 when storage cannot be read.
View as MarkdownAuthorization
bearer In: header
Path Parameters
uuidResponse Body
application/octet-stream
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/attachments/497f6eca-6276-4993-bfeb-53cbbbba6f08/content"Delete an attachment and its stored file
Authenticated and org-scoped: holding the link must not be enough to destroy the file. Removes the object from storage inline, so the file stops being served at once. Reach follows the parent — the attachment's issue, or its comment's issue — so an attachment outside the caller's workspace answers 404, never 403. So does one already deleted, which makes a repeated delete idempotent, and one whose parent is already gone: there is no workspace left to authorize it, and a background sweeper reclaims those. 200 even when storage refuses the delete: the attachment has left every view the caller can see, and the row stays marked so the sweeper finishes the file. 501 when storage is not configured, since marking the row would hide the only record of a file that could never be removed.
List labels
Labels across the org's teams, ordered by name. Filter with team_id. Each carries issueCount, the number of non-deleted issues that still have it, so a caller can weigh a delete before making one.