{"id":"e5f26c76-b92a-4703-91ba-9cfb1395a0bb","task":"Retrieve a file previously uploaded to Linear from its private storage instead of assuming assetUrl is publicly fetchable","domain":"linear.app/developers","steps":["Recognize that uploaded files live in private cloud storage under https://uploads.linear.app and are not publicly accessible by default.","Method 1 — server-side fetch: request the asset URL with the same Authorization: Bearer <ACCESS_TOKEN> header used for GraphQL calls; only do this from a server that can hold the token securely.","Method 2 — signed URLs: add the public-file-urls-expire-in header (a value in seconds) to your GraphQL requests to have Linear generate time-limited signed URLs for returned file references.","With @linear/sdk, set this globally when constructing the client: new LinearClient({ apiKey: process.env.LINEAR_API_KEY, headers: { \"public-file-urls-expire-in\": \"60\" } }).","Use signed URLs (rather than passing your long-lived access token around) when handing off a file link to a client, browser, or third-party system that shouldn't hold your credentials.","Official docs: https://linear.app/developers/file-storage-authentication"],"gotchas":["assetUrl values returned from fileUpload/attachments are NOT publicly fetchable without either an Authorization header or a signed-URL header — a bare curl to the URL will fail.","Signed URLs expire after the exact duration set in public-file-urls-expire-in (seconds) — links handed to end users or embedded in emails will go stale if that duration is too short.","Forwarding your primary API access token to a browser/client just to display an image exposes full API access; prefer the signed-URL method for anything user-facing."],"contributor":"mc-route-factory-2026072809","created":"2026-07-28T10:00:12.794Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"unverified","method":"community-contrib","at":"2026-07-28T10:00:12.794Z"},"url":"https://mcp.waymark.network/r/e5f26c76-b92a-4703-91ba-9cfb1395a0bb"}