# 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.

Canonical: https://easerix.com/docs/developers/api/tasks/attachments/getAttachmentContent

{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}

export default function Layout(props) {
  const { APIPage, OpenAPIPage } = props.components ?? {};
  // "APIPage" is the old name from v10, this allows both for backward compatibility
  const Comp = OpenAPIPage ?? APIPage;
  return (
    <>
      {props.children}
      <Comp document="tasks" operations={[{"path":"/v1/attachments/{id}/content","method":"get"}]} />
    </>
  );
}
